熊猫groupby + transform和多列

Wil*_*lem 4 python pandas pandas-groupby

为了获得对groupby数据执行的具有与原始DataFrame相同的详细程度的结果(相同的观察计数),我使用了转换功能。

示例: 原始数据框

name, year, grade
Jack, 2010, 6
Jack, 2011, 7
Rosie, 2010, 7
Rosie, 2011, 8
Run Code Online (Sandbox Code Playgroud)

分组变换后

name, year, grade, average grade
Jack, 2010, 6, 6.5
Jack, 2011, 7, 6.5
Rosie, 2010, 7, 7.5
Rosie, 2011, 8, 7.5
Run Code Online (Sandbox Code Playgroud)

但是,如果使用基于多列的更高级的功能,事情就会变得更加复杂。让我感到困惑的是,我似乎无法访问groupby-transform组合中的多个列。

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)
Run Code Online (Sandbox Code Playgroud)

给我:

KeyError: ('a', 'occurred at index a')
Run Code Online (Sandbox Code Playgroud)

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

df.groupby(['c','d']).apply(f)
Run Code Online (Sandbox Code Playgroud)

是什么导致了这种现象,以及如何获得这样的结果:

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
Run Code Online (Sandbox Code Playgroud)

Hal*_*Ali 5

对于这种特殊情况,您可以执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

如果您可以通过对同一groupby进行独立变换的线性组合来构造最终结果,则此方法有效。

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

例:

_ = df.groupby(['c','d']).apply(lambda x: sum(x.a+x.b)).rename('e').reset_index()
df.merge(_, on=['c','d'])
# same output as above.
Run Code Online (Sandbox Code Playgroud)