注意这个问题没有询问在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
和scipy.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
的前两个输出参数是您的k
和b
。
输出:
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)