如何使用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
相关产品推荐
相关产品推荐

