pandas DataFrame字符串列按下划线位置截断返回NaN问题求解
问题原因
- 核心问题在于
df[0].str.rfind('_')返回的是和DataFrame行数一致的Series对象,而str[]切片语法传入Series时,pandas会将其视为行索引进行匹配,而非逐行对应位置做切片,匹配不到对应索引就会返回NaN。 - 额外说明:如果字符串中不存在下划线,
rfind会返回-1,你当前场景明确每行都有下划线所以不是本次问题的诱因,后续如果存在异常值需要额外处理该情况。
解决方法
以下几种方案都可以实现需求,按需选择即可:
方法1:split拆分取首段(最简洁)
按下划线拆分字符串后直接取第一个元素,为避免多个下划线导致拆分错误可以加n=1参数限制只拆分一次:
# 通用写法,自动处理多个下划线场景 df[0] = df[0].str.split('_', n=1).str[0]
方法2:正则提取(容错性最高)
用正则直接匹配下划线之前的所有内容,expand=False会直接返回Series无需额外格式转换:
df[0] = df[0].str.extract(r'^(.*?)_', expand=False)
方法3:保留rfind逻辑的写法
如果你坚持要用rfind的计算逻辑,可以转成逐行处理或者把位置结果转成numpy数组再切片:
# 逐行apply写法 df[0] = df[0].apply(lambda x: x[:x.rfind('_')]) # 转数组切片写法 df[0] = df[0].str[:df[0].str.rfind('_').values]
内容的提问来源于stack exchange,提问作者brendan1229
相关产品推荐
相关产品推荐

