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

如何利用正确城市名列表过滤DataFrame中的拼写错误行?现有isin相关代码无法实现需求

解决DataFrame城市名称拼写错误的过滤问题

看起来你遇到的问题主要出在两个核心点:city_list的格式错误和大小写不匹配,再加上之前的代码逻辑有小偏差,导致过滤效果不符合预期。我来帮你一步步解决:

先排查核心问题

  1. city_list格式错误:你写的city_list = [('Aberdeen', 'Ahoskie', ...)]是列表嵌套元组的结构,isin()会尝试匹配整个元组而非单个城市字符串,这肯定匹配不到任何行。
  2. 大小写不匹配:示例数据里的城市是全大写(比如ABERDEEN),但city_list里是首字母大写的格式,直接用isin()会因为大小写不同判定为不匹配。
  3. 逻辑反向:你第一个代码用了~取反,这会保留拼写错误的行,和你"过滤错误、保留正确"的需求刚好相反。

正确解决方案

步骤1:修正city_list格式

把嵌套的元组拆成纯字符串列表:

# 正确的格式:直接是字符串组成的列表
city_list = ['Aberdeen', 'Ahoskie', 'Alamance', 'Albermarle', ...]

步骤2:统一大小写后匹配(最可靠的方法)

为了避免大小写差异导致的匹配失败,我们把DataFrame的city列和city_list都转换为小写(或大写)后再做匹配:

import pandas as pd

# 假设你的原始DataFrame叫df
# 把city列转小写,和转小写后的正确城市列表匹配
df_clean = df[df['city'].str.lower().isin([city.lower() for city in city_list])]

可选:如果需要严格匹配大小写

如果你要求必须完全匹配大小写(比如只保留Aberdeen而不是ABERDEEN),直接用修正后的city_list做匹配即可:

df_clean = df[df['city'].isin(city_list)]

测试你的示例数据

用你给出的示例数据:

索引citycrashes
915ABERDEE1
97ABERDEEN587
916ABSHERS1
917ACME1

假设city_list包含'Aberdeen',运行第一种方法后,df_clean只会保留索引97的行(ABERDEEN转小写后和aberdeen匹配),其他拼写错误的行都会被过滤掉,完全符合你的需求。

解释你之前代码的问题

  • df = df[~df['city'].isin(city_list)]:~是取反操作,会保留不在正确列表里的行(也就是错误拼写的),逻辑反向;再加上city_list格式错误,所以完全不对。
  • df = df[df['city'].apply(lambda x: tuple([y.lower() for y in x])).isin(city_list)]:这个逻辑完全没必要,你把单个城市字符串拆成了小写字符的元组(比如ABERDEEN变成('a','b','e',...)),和city_list里的字符串完全不匹配,自然筛选不到任何行。
  • df = df[np.isin(df['city'], city_list)]:这个逻辑本身没问题,但因为city_list格式错误(嵌套元组)和大小写不匹配,导致匹配失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:12:38