python - Groupby 多列 & Sum - 创建新列并添加 If 条件

我需要对多个列进行分组,然后在添加了 If 条件的新列中获取 Sum 。我尝试了下一个代码,它非常适合按单列分组:

df['new column'] = (
    df['value'].where(df['value'] > 0).groupby(df['column1']).transform('sum')
)

但是,当我尝试 group by 多个列时出现错误。

df['new_column'] = (
        df['value'].where(df['value'] > 0).groupby(df['column1', 'column2']).transform('sum')
    )

错误:

->return self._engine.get_loc(casted_key) 
The above exception was the direct cause of the following exception: 
->indexer = self.columns.get_loc(key) 
->raise KeyError(key) from err 
->if is_scalar(key) and isna(key) and not self.hasnans: ('column1', 'column2')

您能否建议我应该如何更改代码以获得相同的结果但按多列分组?

谢谢

回答1

错误原因

  • 选择多列 df['column1', 'column2'] 的语法是错误的。这应该是 df[['column1', 'column2']]
  • 即使您将 df[['column1', 'column2']] 用于 groupby,pandas 也会引发另一个错误,抱怨 grouper 应该是 one dimensional。这是因为 df[['column1', 'column2']] 返回一个二维对象的数据框。

如何修复错误?

艰辛的道路:

将每个分组列作为一维系列传递给 groupby

df['new_column'] = (
        df['value']
          .where(df['value'] > 0)
          .groupby([df['column1'], df['column2']]) # Notice the change
          .transform('sum')
)
简单的方法:

首先将屏蔽列 values 分配给目标列,然后像往常一样执行 groupby + transform

df['new_column'] = df['value'].where(df['value'] > 0)
df['new_column'] = df.groupby(['column1', 'column2'])['new_column'].transform('sum')

相似文章

python - Python - 在多行和多列中比较 values

我是Python的新手,我有一个如下所示的数据框(请参阅原始数据table)。最终目标是协调来自2个系统(sys1与sys2,在“源”列中标记)的记录(即id、rg、prd和数量)。我如何使用1个函数...

随机推荐

最新文章