使用Pandas将未排序的分散年份列合并为单列并重塑数据表格的方法
Pandas合并重复年份列并按年份聚合月度数据的解决方案
我懂你现在的困扰——这份TSV里年份和月份是分散配对、顺序打乱的,直接硬凑肯定行不通。别慌,咱们用Pandas的重塑功能就能轻松搞定,一步步来:
第一步:读取并确认数据
首先读取你的TSV文件,因为列头有重复的year,Pandas会自动给重复列名加上后缀(比如year.1、year.2),方便后续区分:
import pandas as pd # 读取TSV文件,sep指定制表符分隔 df = pd.read_csv('your_file.tsv', sep='\t', header=0) # 看看读取后的列名,应该是:['Jan', 'year', 'Feb', 'year.1', 'March', 'year.2'] print(df.columns)
如果不想找文件测试,也可以直接用你提供的数据构造完全匹配的示例DataFrame:
# 按你的数据行拆分构造示例(共4行,每行对应6个列值) data = { 'Jan': [23, 25, 21, 27], 'year': [1992, 1990, 1993, 1991], 'Feb': [34, 36, 38, 30], 'year.1': [1991, 1993, 1992, 1990], 'March': [43, 45, 47, 49], 'year.2': [1993, 1990, 1991, 1992] } df = pd.DataFrame(data)
第二步:把分散的月-年数据转成长格式
咱们需要把每个月份和它对应的年份列配对,然后合并成一个统一的长表,这样年份和月度值就能准确绑定:
# 提取Jan和对应的year列,重命名并标记月份 jan_data = df[['Jan', 'year']].rename(columns={'Jan': 'value'}) jan_data['month'] = 'Jan' # 提取Feb和对应的year.1列 feb_data = df[['Feb', 'year.1']].rename(columns={'Feb': 'value', 'year.1': 'year'}) feb_data['month'] = 'Feb' # 提取March和对应的year.2列 march_data = df[['March', 'year.2']].rename(columns={'March': 'value', 'year.2': 'year'}) march_data['month'] = 'March' # 合并三个月份的数据 long_df = pd.concat([jan_data, feb_data, march_data], ignore_index=True)
这一步之后,long_df会变成每一行对应一个年份+一个月份+对应数值的结构,彻底解决了年份分散的问题。
第三步:转成目标宽格式表格
现在用pivot把长表转回宽表,按year分组,每个月份作为独立列:
# 转成宽格式,year作为行索引,month作为列,value作为对应值 result = long_df.pivot(index='year', columns='month', values='value').reset_index() # 调整列的顺序,和你想要的格式完全匹配 result = result[['year', 'Jan', 'Feb', 'March']] # 移除列名的层级标记,让表格更整洁 result.columns.name = None
最终结果
运行完上面的代码,result就是你想要的格式:
| year | Jan | Feb | March |
|---|---|---|---|
| 1990 | 25 | 30 | 45 |
| 1991 | 27 | 34 | 47 |
| 1992 | 23 | 38 | 49 |
| 1993 | 21 | 36 | 43 |
核心思路就是先把分散的配对数据转成长格式统一管理,再转成宽格式聚合,这样不管年份怎么打乱,都能准确对应到每个月份的值。
内容的提问来源于stack exchange,提问作者Aditya Singh
相关产品推荐
相关产品推荐

