Впервые на python, но я пытаюсь, все советы приветствуются.
У меня есть лист основных данных, который я загрузил во фрейм данных. Затем я смог жестко закодировать значение из столбца «Delivery BA», чтобы получить фрейм данных только с этим значением. Я также был в состоянии перечислить и посчитать уникальные значения в столбце. В настоящее время у меня есть ячейка, в которой отображается строковое значение критерия фильтра, выбранного для столбца «Delivery BA».
То, что я ИДЕАЛЬНО хотел бы сделать, - это иметь возможность предложить пользователю окно выбора, содержащее все уникальные значения в столбце, а затем, после выбора пользователем значения, передать это значение параметрам dataframe, чтобы он создает фрейм данных только с этим «BA доставки» для записей, предпочтительно без необходимости доступа к значению, переданному в ячейке строки фильтра.
Я искал и искал, поэтому прошу прощения, если на этот вопрос уже был дан ответ, или что-то подобное.
Пожалуйста, посмотрите, какой у меня пока маленький код.
Объяснение переменных:
д: Количество записей в столбце «Доставка БА»
g: не уверен, что я здесь делал; Я считаю, пытаясь идентифицировать столбец как «Доставка BA»
h: Записи для конкретной компании в столбце
j: Доступ к ячейке, содержащей строковое значение выбранных критериев фильтра
Q: Это не сделало то, что я хотел; Теперь я не уверен, чего хотел
x: Уникальные значения в столбце «Доставка BA»
y: количество уникальных значений в столбце «Delivery BA». На момент написания он находится в 739.
Извинения, если я опубликовал что-либо произвольное или недостаточно информации. Еще раз спасибо.
РЕДАКТИРОВАТЬ: Потратив на это ВСЕ ДЕНЬ, я наконец-то создал программу на python, которая работает. Я чувствую себя глупо гордым. Во многом это фрагменты кода, скомпилированные и настроенные, но в конце концов все работает вместе.
import pandas
data = pandas.read_excel('****', header = None).values
df = pandas.DataFrame(data)
new_header = df.iloc[0]
df = df[0:]
df.columns = new_header
d = df['Delivery BA'].value_counts()
g = df.groupby('Delivery BA', as_index = False)
x = df['Delivery BA'].unique()
y = df['Delivery BA'].nunique()
xd = pandas.DataFrame(x)
xdList = x.tolist()
xdLists = sorted(xdList, key = str.lower)
import tkinter
from tkinter import *
class simpleapp_tk(tkinter.Tk):
def __init__(self, parent):
tkinter.Tk.__init__(self, parent)
self.part = parent
self.initialize()
self.update_list()
def initialize(self):
self.grid()
self.create_widgets()
self.lbox.bind('<ButtonRelease-1>', self.selecting)
button = tkinter.Button(self, text=u"Confirm Selection",command=self.OnButtonClick)
button.grid(column=0,row=2)
self.labelVariable = tkinter.StringVar()
label = tkinter.Label(self,textvariable=self.labelVariable,anchor="center",fg="white",bg="blue")
label.grid(column=0,row=3,columnspan=2,sticky='EW')
self.grid_columnconfigure(0,weight=1)
self.resizable(False,False)
def create_widgets(self):
self.search_var = StringVar()
self.search_var.trace("w", lambda name, index, mode: self.update_list())
self.entry = Entry(self, textvariable = self.search_var, width = 26)
self.yScroll = tkinter.Scrollbar(self, orient=VERTICAL)
self.yScroll.grid(row=1,column=1, sticky=N+S)
self.lbox = Listbox(self, width=45, height=15, yscrollcommand=self.yScroll.set)
self.entry.grid(row=0, column = 0, padx = 10, pady = 3)
self.lbox.grid(row=1, column=0, padx=10, pady=3)
self.yScroll['command'] = self.lbox.yview
self.update_list()
def update_list(self):
search_term = self.search_var.get()
lbox_list = [*xdLists]
self.lbox.delete(0, END)
for item in lbox_list:
if search_term.lower() in item.lower():
self.lbox.insert(END, item)
def selecting(self,event):
sel = self.lbox.curselection()
seltext = self.lbox.get(sel)
self.labelVariable.set(seltext)
def OnButtonClick(self):
global confirmedsel
confirmedsel = ""
sel = self.lbox.curselection()
seltext = self.lbox.get(sel)
confirmedsel = seltext
print(confirmedsel)
app.destroy()
if __name__=="__main__":
app = simpleapp_tk(None)
app.title('Please choose a company!')
print ('Starting mainloop()')
app.mainloop()
from shutil import copyfile
import datetime
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl import *
template_file = '***'
output_file = confirmedsel + " " + "-" + " " + datetime.datetime.today().strftime('%Y-%m-%d') + ".xlsx"
print(output_file)
h = df.loc[df['Delivery BA'] == confirmedsel]
wb = openpyxl.load_workbook(template_file)
ws = wb.get_sheet_by_name('Sheet1')
ws['A1']
for r in dataframe_to_rows(h, index=False, header=True):
ws.append(r)
ws.delete_rows(1, amount=1)
attachment = str(output_file)
attachpath = "***"
attachfull = attachpath+attachment
attachf = str(attachfull)
wb.save(attachf)
import win32com.client as win32
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
attachment = str(output_file)
attachpath = "***"
attachfull = attachpath+attachment
attachf = str(attachfull)
print(attachf)
mail.Attachments.Add(Source=attachf)
mail.Display(True)