#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