如何利用正确城市名列表过滤DataFrame中的拼写错误行?现有isin相关代码无法实现需求
解决DataFrame城市名称拼写错误的过滤问题
看起来你遇到的问题主要出在两个核心点:city_list的格式错误和大小写不匹配,再加上之前的代码逻辑有小偏差,导致过滤效果不符合预期。我来帮你一步步解决:
先排查核心问题
- city_list格式错误:你写的
city_list = [('Aberdeen', 'Ahoskie', ...)]是列表嵌套元组的结构,isin()会尝试匹配整个元组而非单个城市字符串,这肯定匹配不到任何行。 - 大小写不匹配:示例数据里的城市是全大写(比如
ABERDEEN),但city_list里是首字母大写的格式,直接用isin()会因为大小写不同判定为不匹配。 - 逻辑反向:你第一个代码用了
~取反,这会保留拼写错误的行,和你"过滤错误、保留正确"的需求刚好相反。
正确解决方案
步骤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)]
测试你的示例数据
用你给出的示例数据:
| 索引 | city | crashes |
|---|---|---|
| 915 | ABERDEE | 1 |
| 97 | ABERDEEN | 587 |
| 916 | ABSHERS | 1 |
| 917 | ACME | 1 |
假设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
相关产品推荐
相关产品推荐

