gpt4 book ai didi

python - 如何跨多列使用 groupby 转换

转载 作者:太空狗 更新时间:2023-10-29 16:56:46 25 4
gpt4 key购买 nike

我有一个大数据框,我按 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com