Печать соответствующих строк из кадра данных для элементов в списке - Python - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь автоматизировать ежедневный отчет. У меня есть таблица Excel, и мне нужно извлечь информацию, чтобы отформатировать ее особым образом. Есть столбцы: 'Invoice', 'Name', 'Address', 'PO #', 'Product', 'Lot', and 'Quantity'.

Во-первых, мне нужна информация, сгруппированная по «Счет-фактура». Для каждого счета необходимо указать имя, адрес и номер заказа. Согласно этой информации, каждая линия продуктов отдельно.

Используя groupby в пандах, я могу группировать большую часть информации по счетам и продуктам, но это не обеспечивает нужный мне формат. Я также попытался поместить столбец счета-фактуры в список и выполнить цикл for для циклического перебора каждого номера счета, но когда я выполняю итерацию в цикле, он просто печатает все продукты для каждого счета-фактуры.

Поскольку я работаю в основном с R и MySQL, я чувствую, что мне нужно использовать оператор where для списка, но я не уверен, как это сделать в цикле. Я также не уверен, как достичь цели печати другой информации, такой как имя, адрес и номер заказа под накладной.

groupby, который не дает правильный формат, а также суммирует количество, когда это не нужно.

group_inv_pro = df.groupby(['Invoice', 'Product', 'Lot'])['Quantity'].sum()
print(group_inv_pro)

Цикл, который я пытался построить. Это дает каждый продукт для каждого счета.

invoices = df['Invoice'].drop_duplicates().tolist()

for invoice in invoices:
     print("Invoice: " + str(invoice))
     for invoice, row in df.iterrows():
         print(row['Product'] + " "  + str(row['Lot']) + " " + str(row['Quantity']))

Отчет, который я пытаюсь создать, содержит следующую информацию в этом формате:

Invoice:

Name:

Address:

PO#:

Product     Lot      Quantity

Пример требуемого формата отчета

Вот пример данных для удобства

import pandas as pd

d = {'Invoice':[632, 632, 632, 633, 633, 634, 634, 634],
     'Name':['Jason', 'Jason', 'Jason', 'Sam', 'Sam', 'Jessica', 'Jessica', 'Jessica'], 
     'Address':['76 Berry Lane', '76 Berry Lane', '76 Berry Lane', '62 Star Dr.', '62 Star Dr.', 
                '28 Jefferson', '28 Jefferson', '28 Jefferson'],
     'PO #':[46, 46, 46, 24, 24, 23, 23, 23],
     'Product':['ZDA89', 'KLP65', 'TYW85', 'ZDA89', 'PLW36', 'KLP65', 'PLW36', 'PLW36'],
     'Lot':[56, 68, 14, 56, 90, 68, 90, 101],
     'Quantity':[2, 1, 1, 3, 3, 9, 4, 4]}
df = pd.DataFrame(data=d)

Пример электронной таблицы

1 Ответ

0 голосов
/ 19 мая 2019

Просто сделайте следующее:

for invoice_no in df['Invoice'].unique():
    df1 = df[df['Invoice']== invoice_no]
    print(f"Invoice: {invoice_no}")
    print(f"Name: {df1['Name'].values[0]}")
    print(f"Address: {df1['Address'].values[0]}")
    print(f"Po: {df1['PO #'].values[0]}")
    print(df1[['Product','Lot','Quantity']].set_index('Product'))
    print("")

Это будет работать для базовой печати. Я предполагаю, что вы используете не html, а просто для автоматизации процесса, и поэтому предлагаете это.

Invoice: 632
Name: Jason
Address: 76 Berry Lane
Po: 46
         Lot  Quantity
Product               
ZDA89     56         2
KLP65     68         1
TYW85     14         1

Invoice: 633
Name: Sam
Address: 62 Star Dr.
Po: 24
         Lot  Quantity
Product               
ZDA89     56         3
PLW36     90         3

Invoice: 634
Name: Jessica
Address: 28 Jefferson
Po: 23
         Lot  Quantity
Product               
KLP65     68         9
PLW36     90         4
PLW36    101         4

На самом деле я думаю, что таблица df должна хранить только ClientId, а не общую информацию, такую ​​как имя, адрес и PO #. Затем в каждом цикле вы должны вызывать на основе идентификатора клиента, чтобы получить информацию о клиенте.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...