我有一个很大的数据帧,我正在按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
但transform
显然无法将多个列组合在一起,因为它分别查看每个列(与apply不同).在速度/优雅方面,下一个最佳选择是什么?例如,我可以使用apply
,然后df['new_col']
通过使用创建pd.match
,但这将需要匹配有时多个groupby列(col1和col2),这似乎真的很hacky /将需要相当数量的代码.
- >是否有一个类似groupby().变换的函数可以使用多个列的函数?如果这不存在,最好的黑客是什么?
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)
产量
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
原始答案:
错误消息:
TypeError: cannot concatenate a non-NDFrame object
建议为了连接,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