Создать поле выбора для передачи строкового значения на основе уникальных значений в столбце Excel. - PullRequest
0 голосов
/ 14 ноября 2018

Впервые на 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)

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете сделать что-то вроде этого, добавить его в конец кода. Если вы запустите python и наберете d, g, h и т. Д. И введете выбранные значения, будет напечатано

def menu():
    choice = input("""What variable do you want to see?
(Choose between: d, g, h, j, q, x and y)

Enter your choice:""")
    if choice == "d":
        print(d)
    elif choice == "g":
        print(g)
    #Etc...

menu()

Получил вдохновение по этой ссылке, может быть, это полезно http://www.teachingcomputing.com/learn.p..._Functions

...