Python:按Store分组对tot_table去重求和并更新DataFrame列
按Store分组对tot_table唯一值求和并更新原列的解决方法
输入数据
原始DataFrame如下:
import pandas as pd df = pd.DataFrame({ 'Store': [11, 11, 11, 11, 12, 12, 12], 'Category': ['AA', 'AA', 'BB', 'BB', 'AA', 'BB', 'BB'], 'Item': ['Apple', 'Orange', 'Potato', 'Carrot', 'Apple', 'Potato', 'Carrot'], 'tot_table': [13.5, 13.5, 11.5, 11.5, 10, 9, 9] })
问题说明
需要按Store分组,对每组内tot_table的唯一值求和,再用这个总和替换原DataFrame的tot_table列。之前尝试的df.groupby('Store')['tot_table'].unique().sum()无法得到预期结果——这段代码会把所有分组的唯一值合并后计算全局总和,而非每个分组单独计算总和。
解决方案
方法一:分步实现
- 先保留原
tot_table的值作为新列split_table,对应期望输出中的该列:df['split_table'] = df['tot_table'] - 计算每个Store对应的
tot_table唯一值总和:store_total = df.groupby('Store')['tot_table'].agg(lambda x: x.unique().sum()) - 将计算好的总和映射回原DataFrame的
tot_table列:df['tot_table'] = df['Store'].map(store_total)
方法二:用transform一步到位
使用groupby.transform可以直接在分组内计算结果并广播到每一行,代码更简洁:
df['split_table'] = df['tot_table'] df['tot_table'] = df.groupby('Store')['tot_table'].transform(lambda x: x.unique().sum())
最终输出
执行上述代码后,得到的DataFrame如下:
Store Category Item tot_table split_table 0 11 AA Apple 25.0 13.5 1 11 AA Orange 25.0 13.5 2 11 BB Potato 25.0 11.5 3 11 BB Carrot 25.0 11.5 4 12 AA Apple 19.0 10.0 5 12 BB Potato 19.0 9.0 6 12 BB Carrot 19.0 9.0
内容的提问来源于stack exchange,提问作者user12345
相关产品推荐
相关产品推荐

