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