无分组展示数据且仅在每组首行显示total_amount求和结果求助
需求实现:按分组首行显示金额总和,其余行显示占位符
原始数据
| id | no_nota | item | amount | total_amount |
|---|---|---|---|---|
| 1 | pos-001 | item a | 2500 | |
| 2 | pos-001 | item b | 3100 | |
| 3 | pos-001 | item a | 2200 | |
| 4 | pos-002 | item b | 5200 | |
| 5 | pos-002 | item a | 3300 | |
| 6 | pos-003 | item b | 4300 |
期望结果
| id | no_nota | item | amount | total_amount |
|---|---|---|---|---|
| 1 | pos-001 | item a | 2500 | 7800 |
| 2 | pos-001 | item b | 3100 | - |
| 3 | pos-001 | item a | 2200 | - |
| 4 | pos-002 | item b | 5200 | 8500 |
| 5 | pos-002 | item a | 3300 | - |
| 6 | pos-003 | item b | 4300 | 4300 |
需求说明
保持原始数据行顺序不变,计算每个no_nota对应的amount总和,仅在每组no_nota的首行显示该总和,同组其余行的total_amount显示为-。
解决方案
1. 使用SQL实现
利用窗口函数计算分组总和,结合行号标记首行,通过条件判断输出对应内容:
SELECT id, no_nota, item, amount, CASE WHEN ROW_NUMBER() OVER (PARTITION BY no_nota ORDER BY id) = 1 THEN SUM(amount) OVER (PARTITION BY no_nota) ELSE '-' END AS total_amount FROM your_table ORDER BY id;
逻辑说明
SUM(amount) OVER (PARTITION BY no_nota):计算每个no_nota分组的金额总和ROW_NUMBER() OVER (PARTITION BY no_nota ORDER BY id):给每个分组内的行按id排序编号CASE语句:仅分组首行显示总和,其余行显示-
2. 使用Python Pandas实现
先计算分组总和,标记非首行记录后填充对应值:
import pandas as pd # 加载原始数据 df = pd.DataFrame({ 'id': [1,2,3,4,5,6], 'no_nota': ['pos-001','pos-001','pos-001','pos-002','pos-002','pos-003'], 'item': ['item a','item b','item a','item b','item a','item b'], 'amount': [2500,3100,2200,5200,3300,4300] }) # 生成每个no_nota的分组总和 group_totals = df.groupby('no_nota')['amount'].transform('sum') # 标记非首行的no_nota记录 is_duplicate = df['no_nota'].duplicated() # 填充total_amount列 df['total_amount'] = group_totals df.loc[is_duplicate, 'total_amount'] = '-' # 输出结果 print(df)
逻辑说明
groupby('no_nota')['amount'].transform('sum'):为每行匹配对应分组的总和df['no_nota'].duplicated():返回布尔值标记重复的no_nota行(即非首行)- 通过
loc将非首行的total_amount替换为-
内容的提问来源于stack exchange,提问作者mansell Senna
相关产品推荐
相关产品推荐

