在groupby聚合函数中将索引或列值作为** KWARG传递

时间:2017-03-23 13:16:10

标签: pandas group-by aggregate kwargs

我正在尝试在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

提前致谢!

1 个答案:

答案 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传递。