Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 在groupby聚合函数中将索引或列值作为**KWARG传递_Pandas_Group By_Aggregate_Keyword Argument - Fatal编程技术网

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

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

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

提前谢谢

这里的问题不是传递列,问题是当传递列时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传递