[英]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.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']))
)
注意。 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.