如何在Python Pandas中按指定列范围汇总DataFrame数值?
在Pandas中添加指定分段汇总行的实现方法
问题描述
现有如下Pandas DataFrame,各列数据类型:
- MONTH_NR:数值型
- MONTH_NAME:对象型
- VALUE:数值型
原始数据:
| MONTH_NR | MONTH_NAME | VALUE |
|---|---|---|
| 1 | JANUARY | 10 |
| 2 | FEBRYARY | 20 |
| 3 | MARCH | 15 |
| 4 | APRIL | 10 |
| 5 | MAY | 11 |
| 6 | JUN | 100 |
| 7 | JULY | 200 |
| 8 | AUGUST | 12 |
| 9 | SEPTEMBER | 20 |
| 10 | OCTOBER | 50 |
| 11 | NOVEMBER | 30 |
| 12 | DECEMBER | 50 |
需要添加3行汇总数据:
- 1-6月的VALUE列数值总和
- 7-12月的VALUE列数值总和
- 1-12月的VALUE列数值总和
期望输出结果:
MONTH_NR | MONTH_NAME | VALUE ---------|-------------|--------- 1 | JANUARY | 10 2 | FEBRYARY | 20 3 | MARCH | 15 4 | APRIL | 10 5 | MAY | 11 6 | JUN | 100 SUM_AFTER_1_6| | 166 7 | JULY | 200 8 | AUGUST | 12 9 | SEPTEMBER | 20 10 | OCTOBER | 50 11 | NOVEMBER | 30 12 | DECEMBER | 50 SUM_AFTER_7_12| | 362 SUM_ALL | | 528
解决方案
通过构造汇总行DataFrame,拆分原数据后按顺序拼接,即可实现需求:
import pandas as pd # 构造原始DataFrame data = { 'MONTH_NR': [1,2,3,4,5,6,7,8,9,10,11,12], 'MONTH_NAME': ['JANUARY','FEBRYARY','MARCH','APRIL','MAY','JUN','JULY','AUGUST','SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER'], 'VALUE': [10,20,15,10,11,100,200,12,20,50,30,50] } df = pd.DataFrame(data) # 计算各分段总和 sum_1_6 = df[df['MONTH_NR'].between(1,6)]['VALUE'].sum() sum_7_12 = df[df['MONTH_NR'].between(7,12)]['VALUE'].sum() sum_all = df['VALUE'].sum() # 构造各汇总行 sum_row_1_6 = pd.DataFrame({ 'MONTH_NR': ['SUM_AFTER_1_6'], 'MONTH_NAME': [''], 'VALUE': [sum_1_6] }) sum_row_7_12 = pd.DataFrame({ 'MONTH_NR': ['SUM_AFTER_7_12'], 'MONTH_NAME': [''], 'VALUE': [sum_7_12] }) sum_row_all = pd.DataFrame({ 'MONTH_NR': ['SUM_ALL'], 'MONTH_NAME': [''], 'VALUE': [sum_all] }) # 拆分原数据并按顺序拼接 result_df = pd.concat([ df.iloc[:6], sum_row_1_6, df.iloc[6:], sum_row_7_12, sum_row_all ], ignore_index=True) # 格式化打印结果(可选) print(result_df.to_string(index=False, col_space=[15,15,10]))
关键说明
- 用
iloc[:6]和iloc[6:]拆分原数据,确保汇总行插入到指定位置 - 每个汇总行单独构造为DataFrame,方便通过
pd.concat完成拼接 ignore_index=True重置拼接后的索引,避免索引重复问题
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

