Pandas忽略大小写与重音匹配两列 替换suburb匹配值为NaN
Pandas 按条件替换suburb列为空值实现
问题场景
当前有如下结构的pandas DataFrame:
| code | town | district | suburb |
|---|---|---|---|
| 02 | Benalmádena | Málaga | Arroyo de la Miel |
| 03 | Alicante | Jacarilla | Jacarilla, Correntias Bajas (Jacarilla) |
| 04 | Cabrera d'Anoia | Barcelona | Cabrera D'Anoia |
| 07 | Lanjarón | Granada | Lanjaron |
| 08 | Santa Cruz de Tenerife | Santa Cruz de Tenerife | Centro-Ifara |
| 09 | Córdoba | Córdoba | Cordoba |
需求:针对suburb列的每一行,若其值转为小写、去除重音后,和同列的district或town值(同样做去重音转小写处理后)完全相等,就将该行suburb值置为NaN。
已编写好的格式化工具函数如下:
# 去重音并转为小写 def rm_accents_lowcase(a): return unidecode.unidecode(a).lower()
预期处理结果:
| code | town | district | suburb |
|---|---|---|---|
| 02 | Benalmádena | Málaga | Arroyo de la Miel |
| 03 | Alicante | Jacarilla | Jacarilla, Correntias Bajas (Jacarilla) |
| 04 | Cabrera d'Anoia | Barcelona | NaN |
| 07 | Lanjarón | Granada | NaN |
| 08 | Santa Cruz de Tenerife | Santa Cruz de Tenerife | Centro-Ifara |
| 09 | Córdoba | Córdoba | NaN |
实现代码
直接按行应用判断逻辑即可,注意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
相关产品推荐
相关产品推荐

