You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()无法得到预期结果——这段代码会把所有分组的唯一值合并后计算全局总和,而非每个分组单独计算总和。

解决方案

方法一:分步实现

  1. 先保留原tot_table的值作为新列split_table,对应期望输出中的该列:
    df['split_table'] = df['tot_table']
    
  2. 计算每个Store对应的tot_table唯一值总和:
    store_total = df.groupby('Store')['tot_table'].agg(lambda x: x.unique().sum())
    
  3. 将计算好的总和映射回原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:35:19