如何从数据列提取特定字符前子串?str.extract返回NaN问题
解决方法
针对你遇到的问题,核心是精准匹配x-y year格式的数据提取x值,同时保留其他格式的原始内容,以下是两种可行的实现方式(基于Pandas):
方法一:提取匹配内容 + 填充原始值
使用str.extract匹配目标格式并提取x,再用fillna将不匹配行的NaN替换为原始数据:
import pandas as pd # 模拟数据示例 df = pd.DataFrame({ 'target_col': ['8-12 year', '5-9 year', '20', '15 year', 'xyz-abc year'] }) # 正则匹配"x-y year"格式,提取x部分;不匹配的行用原数据填充 df['cleaned_col'] = df['target_col'].str.extract(r'(.*?)-.*? year', expand=False).fillna(df['target_col'])
方法二:直接替换目标格式内容
使用str.replace仅对符合x-y year格式的行进行替换,将整行内容替换为x值,不匹配的行保持原样:
df['cleaned_col'] = df['target_col'].str.replace(r'(.*?)-.*? year', r'\1', regex=True)
原方法返回NaN的原因
你使用的正则(.{,2}(-))存在两个问题:
- 匹配范围过窄:仅能匹配最多2个字符加短横线的内容,无法覆盖所有可能的x值格式;
str.extract默认会对不匹配正则的行返回NaN,且你未对这些NaN做填充处理,导致非目标格式行全部变成NaN。
内容的提问来源于stack exchange,提问作者Graleon3
相关产品推荐
相关产品推荐

