Python Pandas向量化正则提取生成NaN问题求助
解决Pandas向量化提取城镇名称时的NaN问题
问题根源
你遇到的NaN问题,核心原因是str.extract()默认参数expand=True会返回DataFrame,而你直接将其赋值给Town_Name这个Series列,导致维度不匹配,赋值失败。另外,正则表达式的匹配逻辑也需要结合实际数据格式调整。
解决方案
以下是两种高效的向量化实现方案,均避免循环,适配大数据集:
方案1:修正原代码的赋值逻辑
通过设置expand=False让str.extract()返回Series,确保赋值时维度匹配:
import pandas as pd def wrangle_data(ih08_df): # 初始化所有行的Town_Name(匹配Loc_id第6位为L的格式) ih08_df['Town_Name'] = ih08_df['Loc_Description'].str.extract(r'^(.+?)(?=\s?\-)', expand=False) # 筛选Loc_id第6位不为'L'的行 non_l_rows = ih08_df['Loc_id'].str[5] != 'L' # 对目标行重新提取,指定expand=False返回Series ih08_df.loc[non_l_rows, 'Town_Name'] = ih08_df.loc[non_l_rows, 'Loc_Description'].str.extract(r'(?<=\s\-)(.+?)(?=\s?\-)', expand=False) return ih08_df
方案2:用np.where实现简洁的条件向量化提取
这种写法更紧凑,逻辑清晰:
import pandas as pd import numpy as np def wrangle_data(ih08_df): # 定义两种场景的正则表达式 regex_l = r'^(.+?)(?=\s?\-)' # Loc_id第6位为L时,匹配开头到第一个分隔符的内容 regex_non_l = r'(?<=\s\-)(.+?)(?=\s?\-)' # 非L时,匹配两个分隔符之间的内容 # 向量化条件赋值 ih08_df['Town_Name'] = np.where( ih08_df['Loc_id'].str[5] == 'L', ih08_df['Loc_Description'].str.extract(regex_l, expand=False), ih08_df['Loc_Description'].str.extract(regex_non_l, expand=False) ) return ih08_df
额外调试建议
如果仍有NaN,检查以下两点:
- 正则匹配逻辑:确认非L行的
Loc_Description格式是否严格符合XX - 城镇名 - XX,如果存在分隔符前后无空格的情况(如XX-城镇名-XX),将正则调整为r'(?<=\-)(.+?)(?=\-)'。 - Loc_id索引正确性:确认
str[5]确实指向第6个字符(Python字符串索引从0开始)。
内容的提问来源于stack exchange,提问作者EkuAVGDroc
相关产品推荐
相关产品推荐

