Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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
Python Dataframe:groupby中用于合并列的用户定义函数_Python_Pandas_Dataframe - Fatal编程技术网

Python Dataframe:groupby中用于合并列的用户定义函数

Python Dataframe:groupby中用于合并列的用户定义函数,python,pandas,dataframe,Python,Pandas,Dataframe,是否可以在groupby中使用一个用户定义的函数,该函数将作为多个列的参数值传递,每个列在一个单独的参数中?在以下“标准”示例中,sum函数分别在v1和v2列上调用: In [110]: dct = { ...: 'id':[1,2,2,3,3,3], ...: 'vl':[1,1,1,1,1,1], ...: 'v2':[2,2,2,2,2,2] ...: } ...: ...: df = pd.DataFra

是否可以在
groupby
中使用一个用户定义的函数,该函数将作为多个列的参数值传递,每个列在一个单独的参数中?在以下“标准”示例中,
sum
函数分别在
v1
v2
列上调用:

In [110]: dct = {
     ...:     'id':[1,2,2,3,3,3],
     ...:     'vl':[1,1,1,1,1,1],
     ...:     'v2':[2,2,2,2,2,2]
     ...: }
     ...:
     ...: df = pd.DataFrame(dct)
     ...: df.groupby('id')['vl','v2'].sum()
     ...:
Out[110]:
vl  v2
id
1    1   2
2    2   4
3    3   6
如何使用两个参数定义
mysum
函数,每个参数都有自己的列,例如:

def f(col1, col2):                                                                                          
    return  col1 * 2 + col2 * 3

因此,实际上,这个函数将两列合并在一个中。可以这样做吗?

您可以通过访问
.values
属性将组转换为numpy数组,然后进行求和,对于
numpy.sum
,默认轴=无,将对输入数组的所有元素求和


要获得加权和:

df.groupby('id')['vl','v2'].apply(lambda g: (g.v1 * 2 + g.v2 * 3).sum())

#id
#1     8
#2    16
#3    24
#dtype: int64

根据需要,您可以使用
*
**
解包
pd.Series
。或者你可以非常明确地对待你的lambda

def f(v1, v2):                                                                                          
    return  v1 * 2 + v2 * 3

df[['v1', 'v2']].apply(lambda x: f(*x), 1)
# or
df[['v1', 'v2']].apply(lambda x: f(**x), 1)
# or
df.apply(lambda x: f(x.v1, x.v2), 1)

0    8
1    8
2    8
3    8
4    8
5    8
dtype: int64

运行此命令时,我得到
TypeError:Series.name必须是可哈希类型
您运行的是哪个版本的python和pandas,我在pandas 0.19.x上没有发现任何错误,python 2.7.12 | Anaconda 4.2.0(x86_64)|(默认值,2016年7月2日,17:43:17)--IPython 5.1.0您还可以检查字典的键。键似乎与您在
groupby
行中使用的列名不匹配。而且我实际上不需要对所有元素求和,它可能是对参数的任何操作,例如
col1*2+col2*3
在`f(*x)中
1
的意思是什么,1`?我直接在
df
上运行
apply
,而不是在
groupby
之后运行。直接执行此操作时,我需要指定要应用的轴。在这种情况下,轴为
1
def f(v1, v2):                                                                                          
    return  v1 * 2 + v2 * 3

df[['v1', 'v2']].apply(lambda x: f(*x), 1)
# or
df[['v1', 'v2']].apply(lambda x: f(**x), 1)
# or
df.apply(lambda x: f(x.v1, x.v2), 1)

0    8
1    8
2    8
3    8
4    8
5    8
dtype: int64