0

0

Pandas数据透视:将月度数据汇总为季度和年度列

聖光之護

聖光之護

发布时间:2025-09-23 10:26:10

|

485人浏览过

|

来源于php中文网

原创

Pandas数据透视:将月度数据汇总为季度和年度列

本教程详细介绍了如何使用Pandas高效地将DataFrame中按YYYYMM格式存储的月度数据汇总为季度和年度数据。通过数据重塑(melt)、字符串操作提取日期信息、自定义映射和分组聚合(groupby),最终将汇总结果以宽格式(新列)呈现,避免了手动硬编码列名的繁琐。

在数据分析场景中,我们经常会遇到需要将细粒度的时间序列数据(如月度数据)聚合到更粗粒度的周期(如季度或年度)的需求。当这些月度数据以列的形式存储在pandas dataframe中时,传统的逐列求和方法会非常低效且难以维护。本教程将提供一个通用且灵活的解决方案,利用pandas的强大功能自动化这一过程。

1. 问题描述与原始数据结构

假设我们有一个Pandas DataFrame,其中包含按YYYYMM格式命名的列,每列代表一个特定月份的数值数据。DataFrame的索引通常是某种标识符(例如,产品ID、区域代码等)。

原始DataFrame示例:

   201003  201004  201005  201006  201007  201008
ID
A      10      11      14      22      10      19
B      14      19      20      22      26      11

我们的目标是将这些月度数据汇总为季度和年度数据,并将结果作为新的列添加到DataFrame中(或生成新的汇总DataFrame),例如生成2010Q2、2010Q3、2010Annual等列。

2. 解决方案步骤

为了实现这一目标,我们将采用以下步骤:

2.1 导入必要的库并准备示例数据

首先,导入Pandas库并创建与问题描述相符的示例DataFrame。

import pandas as pd

# 原始数据示例
data = {
    '201003': [10, 14],
    '201004': [11, 19],
    '201005': [14, 20],
    '201006': [22, 22],
    '201007': [10, 26],
    '201008': [19, 11]
}
df_original = pd.DataFrame(data, index=['A', 'B'])

# 确保索引有名称,便于后续melt操作
df_original.index.name = 'ID'

print("原始DataFrame:")
print(df_original)

2.2 数据重塑:将列转换为行 (df.melt())

这是解决问题的关键一步。df.melt()函数可以将DataFrame从宽格式(多个数据列)转换为长格式(数据列被“融化”到行中)。这样,每个月度值都将成为一行,并且其对应的YYYYMM列名将作为新列中的值。

白果AI论文
白果AI论文

论文AI生成学术工具,真实文献,免费不限次生成论文大纲 10 秒生成逻辑框架,10 分钟产出初稿,智能适配 80+学科。支持嵌入图表公式与合规文献引用

下载
# 将月份列转换为行,同时保留ID列作为标识符
df_melted = df_original.reset_index().melt(
    id_vars='ID',          # 指定作为标识符的列
    var_name='YYYYMM',     # 新的列名,用于存放原月份列名
    value_name='Value'     # 新的列名,用于存放原月份列的值
)

print("\n步骤2.2: 数据重塑后的DataFrame (部分):")
print(df_melted.head())

说明:

  • df_original.reset_index(): 将原始DataFrame的索引('ID')转换为普通列,以便在melt操作中保留。
  • id_vars='ID': 指定哪些列作为标识符列(不被融化)。
  • var_name='YYYYMM': 指定新列的名称,该列将包含原始DataFrame中被融化的列名(即YYYYMM字符串)。
  • value_name='Value': 指定新列的名称,该列将包含原始DataFrame中被融化的列的值。

2.3 提取年份和月份信息

在长格式DataFrame中,YYYYMM列包含了我们需要的所有日期信息。我们可以使用字符串切片来轻松提取年份和月份。

df_melted['Year'] = df_melted['YYYYMM'].str[:4]  # 提取前4位作为年份
df_melted['Month'] = df_melted['YYYYMM'].str[4:] # 提取后2位作为月份

print("\n步骤2.3: 提取年份和月份后的DataFrame (部分):")
print(df_melted.head())

2.4 映射月份到季度

为了计算季度总和,我们需要将每个月份映射到其对应的季度。这可以通过创建一个字典映射并使用df.map()方法来实现。

month_quarter_map = {
    '01': 1, '02': 1, '03': 1,
    '04': 2, '05': 2, '06': 2,
    '07': 3, '08': 3, '09': 3,
    '10': 4, '11': 4, '12': 4
}
df_melted['Quarter'] = df_melted['Month'].map(month_quarter_map)

print("\n步骤2.4: 映射月份到季度后的DataFrame (部分):")
print(df_melted.head())

2.5 计算季度和年度总和

现在,数据已经准备好进行聚合。我们可以使用groupby()方法按ID、Year和Quarter(或仅Year)进行分组,然后对Value列求和。

# 计算季度总和:按ID、年份和季度分组,并对'Value'列求和
quarterly_sums = df_melted.groupby(['ID', 'Year', 'Quarter'])['Value'].sum().reset_index()

print("\n步骤2.5: 季度总和结果:")
print(quarterly_sums)

# 计算年度总和:按ID和年份分组,并对'Value'列求和
annual_sums = df_melted.groupby(['ID', 'Year'])['Value'].sum().reset_index()

print("\n步骤2.5: 年度总和结果:")
print(annual_sums)

2.6 将汇总结果重塑为宽格式列

为了将季度和年度总和作为新的列添加到DataFrame中,我们可以使用pivot_table()或unstack()方法将长格式的聚合结果转换回宽格式。

# 季度总和宽格式
quarterly_wide = quarterly_sums.pivot_table(
    index='ID',
    columns=['Year', 'Quarter'],
    values='Value'
).fillna(0) # 填充可能缺失的季度数据,例如某些ID在特定季度没有数据

# 优化列名,使其更具可读性,例如 '2010Q1'
quarterly_wide.columns = [f"{year}Q{quarter}" for year, quarter in quarterly_wide.columns]

print("\n步骤2.6: 季度总和 (宽格式

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

51

2025.12.04

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

277

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

252

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Rust 教程
Rust 教程

共28课时 | 4.3万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号