繁体   English   中英

作用于 pandas 中多个列的自定义聚合

[英]Custom aggregation that acts on more than one columns in pandas

请注意,此问题不会询问在 pandas 中我们是否可以在聚合期间对多个列应用函数。 这是一个例子:

数据框:

A x y
foo 0 0
foo 1 1
foo 2 2
foo 3 3
bar 0 2
bar 2 3
bar 4 4
bar 6 5

我想按A列对这个表进行分组,并计算每组的线性回归y=k*x+b 所以我们要实现这个:

A k b
foo 1.0 0.0
bar 0.5 2.0

我尝试按索引A分组,并使用aggregate方法:

grouped = table.groupby('A')
grouped.aggregate(f)

def f():
    pass

虽然我发现此方法会将表格拆分为系列并将该系列提供给函数f ,因此f无法同时访问两列。

那么,我该如何做这种以拆分-应用-组合的方式作用于多列的“聚合”功能呢?

如果需要一起处理多个列,请使用GroupBy.apply

def f(x):
    print (x)

grouped = table.groupby('A').apply(f)

groupby.applyscipy.stats.linregress一起使用:

from scipy.stats import linregress

out = (df.groupby('A', as_index=False)
         .apply(lambda g: pd.Series(linregress(g['x'], g['y'])[:2],
                                    index=['k', 'b']))
       )

注意。 linregress的前两个输出参数是您的kb

输出:

     A    k    b
0  bar  0.5  2.0
1  foo  1.0  0.0

具有自定义功能的解决方案:

from scipy.stats import linregress

def f(x):
    t = linregress(x['x'], x['y'])
    return pd.Series({'k': t.slope, 'b': t.intercept})

df = df.groupby('A', as_index=False).apply(f)
print (df)
     A    k    b
0  bar  0.5  2.0
1  foo  1.0  0.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM