Groupby 多列和 Sum - 创建新列并添加 If 条件
Groupby multiple columns & Sum - Create new column with added If Condition
我需要对多列进行分组,然后在添加了 If 条件的新列中获取总和。我尝试了下一个代码,它非常适合按单列分组:
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')
你能告诉我应该如何更改代码以获得相同的结果但按多列分组吗?
谢谢
错误原因
- select 多列
df['column1', 'column2']
的语法错误。这应该是 df[['column1', 'column2']]
- 即使您对
groupby
使用 df[['column1', 'column2']]
,pandas 也会引发另一个错误,抱怨石斑鱼应该是 one dimensional
。这是因为 df[['column1', 'column2']]
returns 数据框是一个二维对象。
如何修复错误?
困难的方式:
将每个分组列作为一维系列传递给 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')
我需要对多列进行分组,然后在添加了 If 条件的新列中获取总和。我尝试了下一个代码,它非常适合按单列分组:
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')
你能告诉我应该如何更改代码以获得相同的结果但按多列分组吗?
谢谢
错误原因
- select 多列
df['column1', 'column2']
的语法错误。这应该是df[['column1', 'column2']]
- 即使您对
groupby
使用df[['column1', 'column2']]
,pandas 也会引发另一个错误,抱怨石斑鱼应该是one dimensional
。这是因为df[['column1', 'column2']]
returns 数据框是一个二维对象。
如何修复错误?
困难的方式:
将每个分组列作为一维系列传递给 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')