基于列值列表删除DataFrame中非国家数据行的高效方法
问题解决方法
你的原始筛选逻辑本身是正确的,没有成功删除目标行基本都是字符串匹配不一致导致的,最常见的原因是Country Name列的取值存在首尾多余空格、或者大小写拼写和non_countries列表中的字符串不匹配。
目前最高效的实现方案如下,利用矢量化操作+集合成员检测,性能远高于循环、apply等写法:
- 先将非国家实体列表转为集合,同时统一做去空格、转小写预处理避免匹配误差,集合的成员检测时间复杂度为O(1),比列表的O(n)效率更高
- 对
Country Name列做同样的标准化处理后,直接用isin做矢量化筛选
示例代码:
# 预处理非国家实体为标准格式的集合 non_country_set = {item.strip().lower() for item in non_countries} # 标准化Country Name列后筛选,直接链式调用reset_index更简洁 df_indicator = df_indicator[ ~df_indicator['Country Name'].str.strip().str.lower().isin(non_country_set) ].reset_index(drop=True)
如果已经确认你的数据集Country Name列没有多余空格、大小写完全和non_countries列表匹配,直接简化为以下写法即可:
df_indicator = df_indicator[~df_indicator['Country Name'].isin(set(non_countries))].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者A_B
相关产品推荐
相关产品推荐

