自定义聚合,作用于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.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']))
)

NB。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

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

def f(x):
print (x)
grouped = table.groupby('A').apply(f)

最新更新