我正在尝试在pandas groupby上运行聚合函数,我将其中一个列作为kwarg或arg传递。我可以通过传递常量但无法弄清楚如何传递列值。
例如
import pandas as pd
import datetime
import numpy as np
def sum_corr(vector, cor):
a = vector.tolist()
radicand = sum([a[i]*a[j] * (1 if i == j else cor) for i in range(len(a)) for j in range(len(a))])
return np.sqrt(radicand)
my_table = pd.DataFrame({'Date':4*pd.bdate_range(datetime.datetime(2017,1,1),periods=4).tolist(),
'Name':[i for i in 'abcd' for j in range(4)],
'corr':[i for i in [0,1,.5,.8] for j in range(4)],
'vals':[1,2,3,4]*4})
我可以用一个常数无问题来调用它
print(my_table.groupby(['Name','corr'],as_index=False).agg(sum_corr,**{'cor':0}))
Name corr vals
0 a 0.0 5.477226
1 b 1.0 5.477226
2 c 0.5 5.477226
3 d 0.8 5.477226
我想把这句话称为“#corr'列类似
print(my_table.groupby(['Name','corr'],as_index=False).agg(sum_corr,**{'cor':my_table['corr']}))
Name corr vals
0 a 0.0 5.477226
1 b 1.0 10
2 c 0.5 8.062258
3 d 0.8 9.273618
提前致谢!
答案 0 :(得分:0)
这里的问题不是传递列,问题是sum_corr()在传递列时返回数组,如果要在agg()中将其用于groupby,则应返回聚合(标量)值对象。
例如,如果您将sum_corr()中的最后一行更改为
return np.sqrt(radicand)
到
return np.sum(np.sqrt(radicand))
然后您的函数返回一个标量,并且
print(my_table.groupby(['Name','corr'],as_index=False).agg(sum_corr,**{'cor':my_table['corr']}))
不产生错误:
Name corr vals
0 a 0.0 131.252407
1 b 1.0 131.252407
2 c 0.5 131.252407
3 d 0.8 131.252407
此示例可能不是您想要实现的,但是它说明了您可以在groupby.agg()中将列作为kwarg传递。