
本教程详细介绍了如何使用Pandas高效地将DataFrame中按YYYYMM格式存储的月度数据汇总为季度和年度数据。通过数据重塑(melt)、字符串操作提取日期信息、自定义映射和分组聚合(groupby),最终将汇总结果以宽格式(新列)呈现,避免了手动硬编码列名的繁琐。
在数据分析场景中,我们经常会遇到需要将细粒度的时间序列数据(如月度数据)聚合到更粗粒度的周期(如季度或年度)的需求。当这些月度数据以列的形式存储在pandas dataframe中时,传统的逐列求和方法会非常低效且难以维护。本教程将提供一个通用且灵活的解决方案,利用pandas的强大功能自动化这一过程。
1. 问题描述与原始数据结构
假设我们有一个Pandas DataFrame,其中包含按YYYYMM格式命名的列,每列代表一个特定月份的数值数据。DataFrame的索引通常是某种标识符(例如,产品ID、区域代码等)。
原始DataFrame示例:
201003 201004 201005 201006 201007 201008IDA 10 11 14 22 10 19B 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列名将作为新列中的值。
# 将月份列转换为行,同时保留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: 季度总和 (宽格式
以上就是Pandas数据透视:将月度数据汇总为季度和年度列的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373175.html
微信扫一扫
支付宝扫一扫