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

Python Pandas中抑制country_converter的NaN警告及性能优化

解决country_converter的NaN警告与处理提速问题

我来帮你搞定这两个问题——先解决烦人的NaN警告,再给大型DataFrame的处理速度提提速,毕竟效率才是关键。


一、精准抑制NaN相关警告

你之前用warnings.filterwarnings没效果,核心原因是:country_converter的警告是通过Python的logging模块输出的,不是标准的warnings模块!所以得从logging入手来屏蔽特定警告:

import logging
# 过滤掉root日志中包含"nan not found in ISO3"的警告
logging.getLogger('root').addFilter(lambda record: "nan not found in ISO3" not in record.getMessage())

把这段代码放在导入country_converter前后都可以,它只会屏蔽你指定的NaN相关警告,其他无效代码(比如XXX、123)的警告仍会正常显示,不会误屏蔽有用信息。


二、大幅提升处理速度:放弃apply,直接批量处理

你当前用apply逐行调用coco.convert,这在大型DataFrame里效率极低——Python的逐元素循环天生慢。其实coco.convert本身就支持批量传入列表/Series,完全不需要逐行处理!直接把整个列传进去,速度能提升好几倍:

优化后的完整代码:

import country_converter as coco
import pandas as pd
import numpy as np
import logging

# 先屏蔽目标警告
logging.getLogger('root').addFilter(lambda record: "nan not found in ISO3" not in record.getMessage())

test = pd.DataFrame({"code":[np.nan, 'XXX', 'USA', 'GBR', "GBR",'SWE/n', "123", "abs", "ABCC", "ABC", np.nan, np.nan]})
# 直接传入整个Series,无需apply逐行处理
test['code_convert'] = coco.convert(names=test["code"], to='ISO3', not_found=np.NaN)

为什么这样更快?

  • apply是逐元素循环,会触发大量重复的函数调用开销;
  • coco.convert内部对批量输入做了优化,用向量式处理代替逐元素操作,能充分利用底层的高效逻辑。

额外小优化:预处理脏数据(可选)

如果你列里还有像'SWE/n'这种带换行符的脏数据,可以先预处理一下,减少无关警告并提升转换准确率:

# 去除字符串两端的空白/换行符,空字符串转NaN
test["code"] = test["code"].str.strip().replace('', np.nan)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:24:12