python pandas如何获取多列分组结果

sei*_*day 5 python-2.7 pandas

我有一个熊猫数据框(名为 df),如下所示:

id, a,  b,  c
1, 10, 10, 10
1, 20, 20, 20
2, 10, 10, 10
2, 20, 20, 20
3, 10, 10, 10
3, 20, 20, 20
Run Code Online (Sandbox Code Playgroud)

我需要在每个组中使用多个列来获得结果。

grouped = df.groupby('id')
grouped['a','b','c'].apply(lambda x,y,z:x*y+z)
Run Code Online (Sandbox Code Playgroud)

但是,第二行有错误:

KeyError: ('a', 'b', 'c').
Run Code Online (Sandbox Code Playgroud)

如何得到这个?

EdC*_*ica 6

您的尝试会引发 a ,KeyError因为它无法像您通常认为的那样将其解析为列选择,虽然df.groupby('id')['a'].head()有效,但df.groupby('id')['a','b'].head()也会引发KeyError. 要选择感兴趣的列,您需要向 subsript 运算符提供感兴趣的列的列表,如下所示:

In [163]:

df.groupby('id')[['a','b','c']].apply(lambda x: x['a']*x['b']*x['c'])
Out[163]:
id   
1   0    1000
    1    8000
2   2    1000
    3    8000
3   4    1000
    5    8000
dtype: int64
Run Code Online (Sandbox Code Playgroud)

编辑

为了进一步阐明为什么按照您的方式执行列选择通常看起来很明智,如果我们参考文档,我们会看到

df.groupby('id')['a']
Run Code Online (Sandbox Code Playgroud)

是更详细的语法糖:

df['a'].groupby('id')
Run Code Online (Sandbox Code Playgroud)

所以如果我们试试这个:

df['a','b']
Run Code Online (Sandbox Code Playgroud)

这也会引发 a KeyError,而这不会:

df[['a','b']]
Run Code Online (Sandbox Code Playgroud)