如何对列未对齐、含年份噪声的多长度DataFrame按指定年份起始排序?
解决方法
针对你这个列混乱、数据带噪声的DataFrame,分四步处理:
1. 规整列名(若读取后列名异常)
原始数据的列是重复的Year/Value/Country三组,读取后可能列名带自动生成的后缀,先手动重置:
import pandas as pd import re # 假设已通过pd.read_csv等方式读取数据到df中 df.columns = ['Year', 'Value', 'Country', 'Year', 'Value', 'Country', 'Year', 'Value', 'Country']
2. 拆分三组数据并合并成规范长表
把三个国家的数据集分别拆出,去掉空值行后合并:
# 拆分每个国家的有效数据 df_france = df.iloc[:, 0:3].dropna(subset=['Year', 'Value']) df_germany = df.iloc[:, 3:6].dropna(subset=['Year', 'Value']) df_usa = df.iloc[:, 6:9].dropna(subset=['Year', 'Value']) # 合并为统一长表 df_long = pd.concat([df_france, df_germany, df_usa], ignore_index=True)
3. 清洗年份噪声
把带标注的年份(比如1858[a])提取纯数字部分:
def clean_year(year_val): # 提取年份字符串中的数字部分并转成整数 return int(re.findall(r'\d+', str(year_val))[0]) df_long['Year'] = df_long['Year'].apply(clean_year)
4. 生成对齐后的宽表,筛选共同年份范围
转成宽表后,只保留所有国家都有数据的年份,再从最早的共同年份开始排序输出:
# 转成宽表:行是年份,列是各国对应数值 df_wide = df_long.pivot(index='Year', columns='Country', values='Value') # 过滤掉有缺失值的年份(即不是所有国家都有数据的年份) df_aligned = df_wide.dropna() # 从最早的共同年份开始,按年份排序输出 df_final = df_aligned.sort_index().loc[df_aligned.index.min():]
运行完成后,df_final就是从所有国家都有有效数据的起始年份开始、按年份有序排列的规整数据。
内容的提问来源于stack exchange,提问作者user888469
相关产品推荐
相关产品推荐

