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

时间:2016-12-18 22:00:33

标签: python pandas dataframe

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

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

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

2 个答案:

答案 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