如何根据起止年份自动生成年份列并转换DataFrame为长格式
Pandas 实现年份区间转宽表/长表方案
以下实现基于pandas,无需手动枚举年份,自动适配所有行的时间区间,千行级数据处理无性能压力。
步骤1:导入依赖并加载数据
首先构造和示例一致的测试数据,实际使用时替换为你自己的DataFrame即可:
import pandas as pd # 示例数据,实际使用替换为你的DataFrame df = pd.DataFrame({ 'Var1': [1, 2, 3], 'Var2': ['A', 'B', 'C'], 'start': [2000, 1990, 2005], 'end': [2022, 1995, 2006] })
步骤2:自动生成二进制标记的宽格式表
代码会自动识别全数据集覆盖的最早、最晚年份,逐列生成1/0有效性标记:
# 自动识别数据集覆盖的完整年份范围 min_year = df['start'].min() max_year = df['end'].max() year_range = range(min_year, max_year + 1) # 向量运算批量生成标记,比逐行循环效率高1~2个数量级 for year in year_range: df[year] = ((df['start'] <= year) & (df['end'] >= year)).astype(int)
执行完上述代码后,df就是需要的宽格式表,结构和给出的宽表示例完全一致。
步骤3:转换为目标长格式表
用pandas内置的melt方法一键转换,不需要额外处理:
df_long = df.melt( id_vars=['Var1', 'Var2'], value_vars=year_range, var_name='Year', value_name='Data_Availability' # 按年份、Var1排序,和示例输出顺序对齐 ).sort_values(by=['Year', 'Var1']).reset_index(drop=True)
注意事项
- 全程不需要手动配置年份列,后续如果数据里新增了更早/更晚的时间区间,代码会自动扩展年份范围
- 所有判断逻辑用pandas向量运算实现,哪怕是十万行级别的数据也能秒级完成处理
- 如果需要保留原
start、end列,只需要在宽表阶段不删除这两列即可,转长表时把这两个字段加入id_vars列表就行
内容的提问来源于stack exchange,提问作者Mikin
相关产品推荐
相关产品推荐

