Использование переменной для метода group by в python pandas

#python #pandas #function #group-by #local-variables

#python #pandas #функция #группировка по #локальные переменные

Вопрос:

У меня есть group by в функции, и я хочу передать метод агрегации. Синтаксис работает до тех пор, пока я не переключу его на переменную. Вот мой фрейм данных:

 import pandas as pd

import numpy as np
np.random.seed(0)
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
                       'office_id': list(range(1, 7)) * 2,
                       'sales': [np.random.randint(100000, 999999)
                                 for _ in range(12)],
                       'units': [np.random.randint(100, 999)
                                 for _ in range(12)]})
 

Вот моя функция, которая не работает:

 def create_all_summary(df,features,column_to_aggregate,agg_method): 
    df_output = df.groupby(features)[column_to_aggregate].agg_method()
    return df_output

test = create_all_summary(df,['state'],['sales','units'],'sum')
 

Ошибка гласит: «*** AttributeError: объект ‘DataFrameGroupBy’ не имеет атрибута ‘agg_method'»
Вот что я хочу сделать (жестко задано):

 test= df.groupby(['state', 'office_id'])['sales','units'].sum()
 

С желаемым результатом моей функции:
введите описание изображения здесь

Ответ №1:

Используйте метод agg, где вы можете использовать count, sum и т. Д

Код:

 import pandas as pd
import numpy as np

def create_all_summary(df,features,column_to_aggregate,agg_method): 
    df_output = df.groupby(features)[column_to_aggregate].agg(agg_method)
    return df_output

np.random.seed(0)
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
                       'office_id': list(range(1, 7)) * 2,
                       'sales': [np.random.randint(100000, 999999)
                                 for _ in range(12)],
                       'units': [np.random.randint(100, 999)
                                 for _ in range(12)]})

test= df.groupby(['state', 'office_id'])['sales','units'].sum()
print(test)

test1 = create_all_summary(df,['state'],['sales','units'],'sum')
print(test1)
 

Вывод:

                  sales  units
state office_id
AZ    2          222579    651
      4          252315    496
      6          835831    949
CA    1          405711    170
      3          710581    187
      5          982371    414
CO    1          404137    586
      3          217952    700
      5          474564    700
WA    2          535829    572
      4          548242    274
      6          459783    805
         sales  units
state
AZ     1310725   2096
CA     2098663    771
CO     1096653   1986
WA     1543854   1651
 

Ответ №2:

Вы можете настроить его следующим образом:

 In [1087]: def create_all_summary(df,features,column_to_aggregate,agg_method):
      ...:     df_output = df.groupby(features)[column_to_aggregate].agg(agg_method)
      ...:     return df_output
      ...: 

In [1089]: test = create_all_summary(df,['state'],['sales','units'],'sum')

In [1090]: test
Out[1090]: 
         sales  units
state                
AZ     1959019   1651
CA     1170343   1029
CO     1502538   1367
WA      800080   1872