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

Pandas忽略大小写与重音匹配两列 替换suburb匹配值为NaN

Pandas 按条件替换suburb列为空值实现

问题场景

当前有如下结构的pandas DataFrame:

codetowndistrictsuburb
02BenalmádenaMálagaArroyo de la Miel
03AlicanteJacarillaJacarilla, Correntias Bajas (Jacarilla)
04Cabrera d'AnoiaBarcelonaCabrera D'Anoia
07LanjarónGranadaLanjaron
08Santa Cruz de TenerifeSanta Cruz de TenerifeCentro-Ifara
09CórdobaCórdobaCordoba

需求:针对suburb列的每一行,若其值转为小写、去除重音后,和同列的district或town值(同样做去重音转小写处理后)完全相等,就将该行suburb值置为NaN。

已编写好的格式化工具函数如下:

# 去重音并转为小写
def rm_accents_lowcase(a):
    return unidecode.unidecode(a).lower()

预期处理结果:

codetowndistrictsuburb
02BenalmádenaMálagaArroyo de la Miel
03AlicanteJacarillaJacarilla, Correntias Bajas (Jacarilla)
04Cabrera d'AnoiaBarcelonaNaN
07LanjarónGranadaNaN
08Santa Cruz de TenerifeSanta Cruz de TenerifeCentro-Ifara
09CórdobaCórdobaNaN

实现代码

直接按行应用判断逻辑即可,注意town和district也要做相同的格式化处理,避免重音、大小写差异导致匹配失败:

import numpy as np
import unidecode
import pandas as pd

def rm_accents_lowcase(a):
    return unidecode.unidecode(a).lower()

df['suburb'] = df.apply(
    lambda row: np.nan
    if rm_accents_lowcase(row['suburb']) in [
        rm_accents_lowcase(row['town']),
        rm_accents_lowcase(row['district'])
    ]
    else row['suburb'],
    axis=1
)

逻辑说明

  • 比对时三列值统一用rm_accents_lowcase做标准化,能正确处理Lanjarón/Lanjaron、Córdoba/Cordoba、Cabrera d'Anoia/Cabrera D'Anoia这类重音、大小写不一致的匹配场景
  • 只有格式化后的suburb值和格式化后的town/district值完全相等才会置空,像code=03行suburb包含district值但不完全相等的情况会保留原值,和预期结果完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:03:25