是否可以在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
因此,实际上,此函数将两列合并为一列。可以这样做吗?
答案 0 :(得分:1)
根据您的需要,您可以使用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
答案 1 :(得分:0)
您可以通过访问.values
属性将组转换为numpy数组,然后执行总和,对于numpy.sum
,默认轴=无,将对所有元素求和输入数组。:
df.groupby('id')['vl','v2'].apply(lambda g: g.values.sum())
#id
#1 3
#2 6
#3 9
#dtype: int64
获得加权总和:
df.groupby('id')['vl','v2'].apply(lambda g: (g.v1 * 2 + g.v2 * 3).sum())
#id
#1 8
#2 16
#3 24
#dtype: int64