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

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,检查以下两点:

  1. 正则匹配逻辑:确认非L行的Loc_Description格式是否严格符合XX - 城镇名 - XX,如果存在分隔符前后无空格的情况(如XX-城镇名-XX),将正则调整为r'(?<=\-)(.+?)(?=\-)'。
  2. Loc_id索引正确性:确认str[5]确实指向第6个字符(Python字符串索引从0开始)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:06:13