#python #pandas #pandas-groupby
Вопрос:
В настоящее время у меня есть файл, в котором я создаю иерархию из продукта и вычисляю процентное разделение на основе предыдущего уровня.
Мой код выглядит так:
data = [['product1', 'product1a', 'product1aa', 10],
['product1', 'product1a', 'product1aa', 5],
['product1', 'product1a', 'product1aa', 15],
['product1', 'product1a', 'product1ab', 10],
['product1', 'product1a', 'product1ac', 20],
['product1', 'product1b', 'product1ba', 15],
['product1', 'product1b', 'product1bb',15],
['product2', 'product2_a', 'product2_aa', 30]]
df = pd.DataFrame(data, columns = ["Product_level1", "Product_Level2", "Product_Level3", "Qty"])
prod_levels = ["Product_level1", "Product_Level2", "Product_Level3"]
df = df.groupby(prod_levels).sum("Qty")
df["Qty ratio"] = df["Qty"] / df["Qty"].sum(level=prod_levels[-2])
print(df)
Это дает мне это в результате:
Qty Qty ratio
Product_level1 Product_Level2 Product_Level3
product1 product1a product1aa 30 0.500000
product1ab 10 0.166667
product1ac 20 0.333333
product1b product1ba 15 0.500000
product1bb 15 0.500000
product2 product2_a product2_aa 30 1.000000
Согласно моей версии pandas (1.3.2), я получаю FutureWarning, что уровень устарел и что вместо него я должен использовать groupby.
FutureWarning: Using the level keyword in DataFrame and Series aggregations is deprecated and will be removed in a future version. Use groupby instead. df.sum(level=1) should use df.groupby(level=1).sum()
К сожалению, я не могу понять, какой был бы правильный синтаксис для получения тех же результатов с помощью Group by, чтобы убедиться, что это будет работать с будущими версиями Pandas. Я пробовал варианты того, что приведено ниже, но ни один из них не сработал.
df["Qty ratio"] = df.groupby(["Product_level1", "Product_Level2", "Product_Level3"]).sum("Qty") / df.groupby(level=prod_levels[-1]).sum("Qty")
Можете ли вы в любом случае предложить, как я мог бы подойти к этому?
Спасибо
Комментарии:
1.
df["Qty"].sum(level=prod_levels[-2])
=>df["Qty"].groupby(level=prod_levels[-2]).sum()
2. ХОРОШО, так что это действительно было так просто… С этого момента я постараюсь более подробно применять рекомендации. Спасибо за очень быструю обратную связь!
Ответ №1:
level
Ключевое слово для многих функций устарело в 1.3. Устаревший: параметр уровня для агрегации в DataFrame и серии # 39983.
Затронуты следующие функции:
- Любой
- ВСЕ
- количество
- сумма
- prod
- макс
- мин
- означает
- медиана
- перекос
- курт
- sem
- var
- std
- безумный
Аргумент level всегда переписывался внутренне, чтобы быть groupby
операцией. По этой причине для повышения четкости и уменьшения избыточности в библиотеке оно устарело.
Общий шаблон — какими бы ни были аргументы уровня, переданные в агрегацию, они должны быть перемещены groupby
вместо этого.
Пример данных:
import pandas as pd
df = pd.DataFrame(
{'A': [1, 1, 2, 2],
'B': [1, 2, 1, 2],
'C': [5, 6, 7, 8]}
).set_index(['A', 'B'])
C
A B
1 1 5
2 6
2 1 7
2 8
С aggregate более level
:
df['C'].sum(level='B')
B
1 12
2 14
Name: C, dtype: int64
FutureWarning: Using the level keyword in DataFrame and Series aggregations is deprecated and will be removed in a future version. Use groupby instead.
Теперь это groupby
заканчивается level
:
df['C'].groupby(level='B').sum()
B
1 12
2 14
Name: C, dtype: int64
В этом конкретном примере:
df["Qty ratio"] = df["Qty"] / df["Qty"].sum(level=prod_levels[-2])
Становится
df["Qty ratio"] = df["Qty"] / df["Qty"].groupby(level=prod_levels[-2]).sum()
* просто переместите аргумент level в groupby