【发布时间】:2016-03-10 01:19:56
【问题描述】:
我有一个大数据框,我按一到 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,然后使用pd.match 创建df['new_col'],但这有时需要匹配多个groupby 列(col1 和col2),这看起来真的很hacky / 需要相当多的代码。
--> 有没有类似 groupby().transform 的函数可以使用在多个列上工作的函数?如果这不存在,最好的 hack 是什么?
【问题讨论】:
-
我不同意接受的答案,并说最好的方法是使用
apply执行您想要的计算,从而每组一行;然后使用pd.merge将此结果合并回原始数据帧,这将为您提供所需的类似索引数据帧。