You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对列未对齐、含年份噪声的多长度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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:25:12