Pandas groupby+transform和多列

2024-04-24 06:04:35 发布

您现在位置:Python中文网/ 问答频道 /正文

为了在groupby数据上获得与原始数据帧相同的细节级别(相同的观察计数),我使用了transform函数。在

示例: 原始数据帧

name, year, grade
Jack, 2010, 6
Jack, 2011, 7
Rosie, 2010, 7
Rosie, 2011, 8

在groupby变换之后

^{pr2}$

然而,随着基于多个列的更高级的函数,事情变得更加复杂。让我困惑的是,我似乎无法访问groupby转换组合中的多个列。在

df = pd.DataFrame({'a':[1,2,3,4,5,6],
               'b':[1,2,3,4,5,6],
               'c':['q', 'q', 'q', 'q', 'w', 'w'],  
               'd':['z','z','z','o','o','o']})

def f(x):
 y=sum(x['a'])+sum(x['b'])
 return(y)

df['e'] = df.groupby(['c','d']).transform(f)

给我:

KeyError: ('a', 'occurred at index a')

虽然我知道以下方法确实有效:

df.groupby(['c','d']).apply(f)

是什么导致了这种行为,我怎样才能得到这样的结果:

a   b   c   d   e
1   1   q   z   12
2   2   q   z   12
3   3   q   z   12
4   4   q   o   8
5   5   w   o   22
6   6   w   o   22

Tags: 数据函数name示例df原始数据transform级别
2条回答

对于这种特殊情况,您可以:

g = df.groupby(['c', 'd'])

df['e'] = g.a.transform('sum') + g.b.transform('sum')

df
# outputs

   a  b  c  d   e
0  1  1  q  z  12
1  2  2  q  z  12
2  3  3  q  z  12
3  4  4  q  o   8
4  5  5  w  o  22
5  6  6  w  o  22

如果您可以在同一groupby上通过独立变换的线性组合来构造最终结果,那么这个方法就可以工作了。在

否则,您将使用groupby-apply,然后合并回原始df。在

示例:

^{pr2}$

您可以将GroupBy+transformsum一起使用两次:

df['e'] = df.groupby(['c', 'd'])[['a', 'b']].transform('sum').sum(1)

print(df)

   a  b  c  d   e
0  1  1  q  z  12
1  2  2  q  z  12
2  3  3  q  z  12
3  4  4  q  o   8
4  5  5  w  o  22
5  6  6  w  o  22

相关问题 更多 >