#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 (), тогда это отлично работает, большое вам спасибо