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

如何根据起止年份自动生成年份列并转换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:42:09