具有多个输出列的熊猫聚合函数

reg*_*ter 6 python aggregate-functions pandas

我正在尝试定义一个具有多个 OUTPUT 列的聚合函数,我想使用如下

df.groupby(by=...).agg(my_aggregation_function_with_multiple_columns)
Run Code Online (Sandbox Code Playgroud)

知道怎么做吗?

我试过这样的事情

def my_aggregation_function_with_multiple_columns(slice_values):
    return {'col_1': -1,'col_2': 1}
Run Code Online (Sandbox Code Playgroud)

但这将在逻辑上在单个列中输出字典 {'col_1': -1,'col_2': 1} ...

jez*_*ael 3

这是不可能的,因为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)
Run Code Online (Sandbox Code Playgroud)

样本:

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
Run Code Online (Sandbox Code Playgroud)