Pandas 在groupby聚合函数中将索引或列值作为**KWARG传递
我正在尝试在pandas groupby上运行聚合函数,其中一列作为kwarg或arg传递。我可以通过传递一个常量来实现这一点,但我不知道如何传递一个列值 比如说Pandas 在groupby聚合函数中将索引或列值作为**KWARG传递,pandas,group-by,aggregate,keyword-argument,Pandas,Group By,Aggregate,Keyword Argument,我正在尝试在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
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
提前谢谢 这里的问题不是传递列,问题是当传递列时sum_corr()返回一个数组,如果要在agg()中为groupby对象使用它,它应该返回聚合(标量)值 例如,如果将sum_corr()中的最后一行从 到 然后函数返回一个标量,然后
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的形式传递列。这里的问题不是传递列,问题是当您传递列时,sum_corr()返回一个数组,如果您想在agg()中将其用于groupby对象,则它应该返回聚合(标量)值 例如,如果将sum_corr()中的最后一行从 到 然后函数返回一个标量,然后
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传递