我有一个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
我需要使用每个组中的多个列来获取结果。
grouped = df.groupby('id')
grouped['a','b','c'].apply(lambda x,y,z:x*y+z)
但是,第二行有错误:
KeyError: ('a', 'b', 'c').
如何获得这个?
答案 0 :(得分:3)
您的尝试会引发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
修改强>
为了进一步说明为什么通常按照您的方式执行列选择似乎是明智的,如果我们引用docs,我们会看到
df.groupby('id')['a']
是更详细的语法糖:
df['a'].groupby('id')
所以如果我们试试这个:
df['a','b']
这也会引发KeyError
,而这不会:
df[['a','b']]