我有一个很大的数据帧,我正在按1到n列分组,并希望在两列(例如foo和bar)上对这些组应用函数.
这是一个示例数据帧:
foo_function = lambda x: np.sum(x.a+x.b)
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']})
# works with apply, but I want transform:
df.groupby(['c', 'd'])[['a','b']].apply(foo_function)
# transform doesn't work!
df.groupby(['c', 'd'])[['a','b']].transform(foo_function)
TypeError: cannot concatenate a non-NDFrame object
Run Code Online (Sandbox Code Playgroud)
但transform显然无法将多个列组合在一起,因为它分别查看每个列(与apply不同).在速度/优雅方面,下一个最佳选择是什么?例如,我可以使用apply,然后df['new_col']通过使用创建pd.match,但这将需要匹配有时多个groupby列(col1和col2),这似乎真的很hacky /将需要相当数量的代码.
- >是否有一个类似groupby().变换的函数可以使用多个列的函数?如果这不存在,最好的黑客是什么?
unu*_*tbu 14
Circa Pandas版本0.18,看来原始答案(下面)不再有效.
相反,如果您需要跨多个列进行groupby计算,请先执行多列计算,然后再执行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']})
df['e'] = df['a'] + df['b']
df['e'] = (df.groupby(['c', 'd'])['e'].transform('sum'))
print(df)
Run Code Online (Sandbox Code Playgroud)
产量
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)
原始答案:
错误消息:
TypeError: cannot concatenate a non-NDFrame object
Run Code Online (Sandbox Code Playgroud)
建议为了连接,foo_function应该返回一个NDFrame(例如Series或DataFrame).如果你返回一个系列,那么:
In [99]: df.groupby(['c', 'd']).transform(lambda x: pd.Series(np.sum(x['a']+x['b'])))
Out[99]:
a b
0 12 12
1 12 12
2 12 12
3 8 8
4 22 22
5 22 22
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10693 次 |
| 最近记录: |