我需要按多列分组&然后在添加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')