分组依据多个列 & Sum - 使用添加的 If 条件创建新列



我需要按多列分组&然后在添加If条件的新列中获取Sum。我尝试了下一个代码,它可以很好地按单列分组:

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

然而,当我尝试按多列分组时,我得到一个错误。

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')

你能告诉我应该如何改变代码,以获得相同的结果,但由多列分组?

谢谢

错误原因

  • 选择多列df['column1', 'column2']语法错误。应该是df[['column1', 'column2']]
  • 即使你用df[['column1', 'column2']]代替groupby,熊猫也会再次报错,抱怨石斑鱼应该是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')
)
的简单方法:

首先将遮罩列的值赋给目标列,然后执行groupby+transform,就像您通常做的那样

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

最新更新