Pandas中代表北美的字符串'NA'非空值 重导入CSV持久处理方案
Pandas字符串'NA'(区域编码)被误识别为缺失值的处理方案
导出再导入是否需要重复执行fillna?
需要。pd.read_csv()默认内置了空值识别列表,其中就包含字符串'NA',所以即使你导出的CSV里存的是代表北美的合法字符串'NA',再次用pandas导入时也会被自动转换为NaN,所以未做额外配置的前提下,每次导入都需要执行fillna(value='NA')修正。
更持久的解决方案与处理技巧
- 方案1:导入时添加参数关闭默认空值规则
只需要在read_csv时传入keep_default_na=False,pandas就不会使用默认的空值识别列表,只有CSV里的空单元格会被识别为NaN,'NA'会作为普通字符串保留,无需后续补全:
注意:如果你的数据里还有其他需要识别为空值的内容,可以搭配df = pd.read_csv("你的文件路径.csv", keep_default_na=False)na_values参数自定义空值列表,比如你希望只把空单元格和字符串'NaN'识别为空:df = pd.read_csv("你的文件路径.csv", keep_default_na=False, na_values=['', 'NaN']) - 方案2:全局配置pandas空值规则(单环境长期生效)
如果你当前的所有项目场景里'NA'都是代表北美的合法值,可以修改pandas全局配置,把'NA'从默认空值列表里移除,后续所有read_csv调用都自动生效,不需要每次加参数:
该配置仅在当前运行的Python环境生效,换环境后重新执行一次即可,也可以把这段代码加入你的Jupyter初始化脚本里自动加载。import pandas as pd # 移除默认空值列表中的'NA' custom_na_values = pd.io.common._NA_VALUES - {'NA'} pd.set_option('io.csv.default_na_values', custom_na_values) - 方案3:改用二进制格式序列化数据(完全避免识别问题)
如果你的数据只在pandas环境之间流转,不需要给其他非Python工具读取,可以导出为parquet、pickle这类二进制格式,会完整保留数据的类型和原始值,不会出现'NA'被误转的问题,也不需要任何额外处理:
导出代码:
导入代码:df.to_parquet("processed_data.parquet")df = pd.read_parquet("processed_data.parquet")
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

