FutureWarning: ключевое слово уровня устарело в 1.3, вместо этого используйте groupby

#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