我有一个大数据框,我按 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
,然后使用 pd.match
创建 df['new_col']
,但这有时需要匹配多个 groupby 列(col1 和 col2)这看起来真的很老套/需要大量代码。
--> 是否有类似 groupby().transform 的函数可以使用处理多列的函数?如果这不存在,最好的黑客攻击是什么?
最佳答案
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
关于python - 如何跨多列使用 groupby 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34099684/