我正在尝试使用多个OUTPUT列定义聚合函数,我想按照以下方式使用
df.groupby(by=...).agg(my_aggregation_function_with_multiple_columns)
任何想法怎么做?
我尝试过像
这样的事情def my_aggregation_function_with_multiple_columns(slice_values):
return {'col_1': -1,'col_2': 1}
但这会在单个列中逻辑输出字典{'col_1': - 1,'col_2':1} ...
答案 0 :(得分:1)
这是不可能的,因为agg
分别处理所有列 - 首先处理第一列,然后处理第二列....到最后。
解决方案为flexible apply
,如果输出为更多标量,则返回多个输出添加Series
。
def my_aggregation_function_with_multiple_columns(slice_values):
return pd.Series([-1, 1], index=['col_1','col_2'])
df.groupby(by=...).apply(my_aggregation_function_with_multiple_columns)
样品:
df = pd.DataFrame(dict(A=[1,1,2,2,3], B=[4,5,6,7,2], C=[1,2,4,6,9]))
print (df)
def my_aggregation_function_with_multiple_columns(slice_values):
#print each group
#print (slice_values)
a = slice_values['B'] + slice_values['C'].shift()
print (type(a))
return a
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
df = df.groupby('A').apply(my_aggregation_function_with_multiple_columns)
print (df)
A
1 0 NaN
1 6.0
2 2 NaN
3 11.0
3 4 NaN
dtype: float64
答案 1 :(得分:0)
这个问题可以用多种方式解释。以下提供了计算多个输出列的解决方案,可以为每列使用不同的函数。
该示例使用与上述答案相同的Pandas DataFrame df:
import pandas as pd
df = pd.DataFrame(dict(A=[1,1,2,2,3], B=[4,5,6,7,2], C=[1,2,4,6,9]))
作为A中各组的函数,计算B中值的总和并将其放入一列,并计算B中值(计数)的数量并将其放入另一列。
df.groupby(['A'], as_index=False).agg({'B': {'B1':sum, 'B2': "count"}})
由于在将来的版本中不推荐使用重命名的字典,因此以下代码可能更好:
df.groupby(['A'], as_index=False).agg({'B': {sum, "count"}})
下一个示例显示了如果要在不同的列上进行不同的计算,计算B的总和和C的平均值,如何执行此操作:
df.groupby(['A'], as_index=False).agg({'B': sum, 'C': "mean"})