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

如何使用Python从Pandas文本列中提取第二个四位数年份?

问题原因

  • 索引越界报错的核心原因是re.findall(r'\d+', txt)返回的列表长度不固定:只有当文本中存在至少2个数字串时,索引1才存在;如果文本只有1个年份、或者完全没有年份,访问data[1]就会触发该错误。
  • 原有正则匹配所有数字的逻辑存在缺陷:如果姓名或者文本其他位置出现无关数字,会干扰年份提取的准确性。

修复方案

方案1:使用精准正则批量提取生卒年(适配Pandas场景,更推荐)

直接匹配括号内的XXXX-XXXX格式,同时兼容只有出生年的(XXXX)格式,一次性返回出生年和死亡年两个结果:

import pandas as pd
import re

def extract_birth_death(txt):
    # 正则匹配括号内的年份,分组分别取出生、死亡年
    match_res = re.search(r'\((\d{4})(?:-(\d{4}))?\)', str(txt))
    if not match_res:
        return (None, None)
    # 校验年份范围的辅助函数
    def check_year(y_str):
        if not y_str:
            return None
        y = int(y_str)
        return y if 1800 <= y <= 2021 else None
    return (check_year(match_res.group(1)), check_year(match_res.group(2)))

# 应用到DataFrame对应列,直接生成两列结果
df[['出生年', '死亡年']] = df['你的文本列名'].apply(lambda x: pd.Series(extract_birth_death(x)))

方案2:沿用原有逻辑单独提取第二个年份

如果你只需要提取死亡年,不需要修改整体匹配逻辑,只需要在取数前增加列表长度判断即可:

import re

def extract_death_year(txt):
    data = re.findall(r'\d+', txt)
    # 先判断列表长度是否≥2,再读取第二个元素
    if len(data) >= 2:
        death_year = float(data[1])
        if 1800 <= death_year <= 2021:
            return death_year
    return None

内容的提问来源于stack exchange,提问作者Gwen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:54:03