熊猫-使用groupby sum和where子句创建新列

时间:2018-08-05 21:11:04

标签: python pandas dataframe

我使用下面的代码行将groupby sum设置为新列

df['new_col'] = df.groupby(['col1', 'col2'])['amount'].transform(sum)

这工作得很好,但是我还只需要求和其他col(map)是确定值的金额

我尝试使用这个:

df['new_col'] = df[df['map'] == 'newCol'].groupby(['col1', 'col2'])['amount'].transform(sum)

但是出现错误:“ ValueError:无法从重复的轴重新索引”

我不能在第一个示例之前使用布尔索引,因为我需要创建几个新列,每个列都将map作为新值。因此,我不能继续像这样修改df。

编辑:

数据示例:

d={'source': {'0': 'r', '1': 'r', '2': 'r', '3': 'r', '4': 'r'}, 'date': {'0': Timestamp, '1': Timestamp, '2': Timestamp, '3': Timestamp, '4': Timestamp}, 'name': {'0': 'A', '1': 'A', '2': 'A', '3': 'A', '4': 'A'}, 'codename': {'0': 'D', '1': 'D', '2': 'D', '3': 'E', '4': 'F'}, 'map': {'0': 'X', '1': 'X', '2': 'X', '3': 'X', '4': 'Y'}, 'amount': {'0': 250.0, '1': 450.0, '2': 360.0, '3': 10.0, '4': -436.0}, 'extra': {'0': 'P', '1': 'P', '2': 'P', '3': 'P', '4': 'P'}}

df = pd.DataFrame(d)

按日期,名称和其他内容分组。所有新列都将按map值不同的值进行求和。

1 个答案:

答案 0 :(得分:1)

[实际上并没有解决,小警告]

确定了

df['new_col'] = df['amount']
df = df[df['map'] == 'X'].groupby(['col1', 'col2'])['new_col'].sum().reset_index()

编辑:这个答案实际上有一个小问题。尝试创建多个新列时出现

df['new_col'] = df['amount']
df['new_col2'] = df['amount']
df = df[df['map'] == 'X'].groupby(['col1', 'col2'])['new_col'].sum().reset_index()
df = df[df['map'] == 'Y'].groupby(['col1', 'col2'])['new_col2'].sum().reset_index()

由于第一个groupby排除了map和new_col2列,因此第二个显然不起作用(KeyError)