Получение суммы продуктов в постоянно меняющемся Excel

#python #excel #pandas #dataframe

Вопрос:

У меня есть файл Excel, который содержит слишком много значений, релевантны только два столбца, и я извлекаю их в новый фрейм данных. Итак, у меня есть две колонки, первая-номер продукта, а вторая-Произведенная сумма. Проблема в том, что номер продукта не совпадает с произведенной суммой. Полученная сумма всегда находится по крайней мере на 1 строку ниже соответствующего Продукта, однако иногда существует более одного значения, и может быть так, что существует 10 строк значений, принадлежащих 1 Продукту.

Моя идея состоит в том, чтобы проиндексировать первый столбец для строк(номер продукта что-то вроде 100 000), затем определить, где он находится и где находится следующая несоответствующая строка. Затем у меня есть диапазон строк или просто число, которое я могу добавить в функцию, подобную этой:

 Product1 = (df.iloc[Product1:Product1 diff1, 1]) Product1 = Product1.sum(axis=0)  

чтобы найти и суммировать числа и т. Д. Цель состоит в том, чтобы иметь сценарий, в который я мог бы вводить Excel в каждый месяц и получать отчет о том, сколько чего было произведено.

Мой вопрос в том, возможно ли это вообще с Python, я предполагаю, что да, и как я этого достигаю, я совсем новичок в Python и пандах. Любая помощь будет очень признательна

Примеры Данных:

Номер продукта Произведенное Количество
A00 001
45
56
87
A00 005 ряд
5
A00 034
27
34

Вывод, который я хотел бы:

Номер продукта Произведенное Количество
A00 001 188
A00 005 5
A00 034 61

Ответ №1:

Я бы использовал groupby и sum . Но поскольку ваш фрейм данных содержит пробелы в Product Number столбце и нечисловые в Produced Amount одном, я бы сначала очистил его:

 tmp = df.assign(**{'Product Number': df['Product Number'].ffill(),  'Produced Amount': pd.to_numeric(df['Produced Amount'], 'coerce')})  

получить:

 Product Number Produced Amount 0 A00 001 NaN 1 A00 001 NaN 2 A00 001 45.0 3 A00 001 56.0 4 A00 001 87.0 5 A00 005 NaN 6 A00 005 NaN 7 A00 005 5.0 8 A00 034 NaN 9 A00 034 NaN 10 A00 034 27.0 11 A00 034 34.0  

Теперь это тривиально:

 tmp.groupby('Product Number').sum().astype('int').reset_index()  

дает, как и ожидалось:

 Product Number Produced Amount 0 A00 001 188 1 A00 005 5 2 A00 034 61  

Комментарии:

1. вы должны добавить df=tmp.groupby(‘Номер продукта’).sum().astype(‘int’).reset_index (), тогда это отлично работает, большое вам спасибо