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
相关产品推荐
相关产品推荐

