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

标签 python pandas

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

相关文章:

python - 如何在 conda environment.yml 文件中 pip 安装包?

python - 如何在pandas数据框中查找同时具有正值和负值的行

python - 拆分出同时包含 str 和 int 的列

用于创建可处理数百万行的 XLSX 文档的 Python(或 C)库

python - Pandas 数据框按两列分组,计数和求和

python - django使用xlrd读取批量excel文件太慢

python - 如何按总和结果将分组分配给 Pandas 中的新列

python - 根据其他列的值填充一列

python pandas 分组依据和聚合列

python - 如何为 Sphinx 自定义模块名称