我有一个大数据框,我按 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
然后创建 df['new_col']
通过使用 pd.match
,但这似乎真的需要匹配 overcol1 和多个 groupby 列) / 需要相当多的代码。
–> 是否有类似于 groupby().transform 的函数可以使用处理多列的函数?如果这不存在,什么是最好的黑客?
原文由 Hillary Sanders 发布,翻译遵循 CC BY-SA 4.0 许可协议
Circa Pandas 版本 0.18,原来的答案(如下)似乎不再有效。
相反,如果您需要跨多列进行 groupby 计算, 请先 进行多列计算,然后再进行 groupby:
产量
原答案:
错误信息:
建议为了连接,
foo_function
应该返回一个NDFrame(例如Series或DataFrame)。如果您返回一个系列,则: