如何将Pandas DataFrame中的<NA>全部转换为nan(Python)
解决方案
一、正确将<NA>转为nan且保留浮点数/字符串
你用pd.to_numeric(errors='coerce')的问题在于:它会尝试把所有列转为数值类型,非数字的字符串会被强制转成nan,直接破坏了你想保留的字符串内容。要实现只替换<NA>、不改动其他数据,分两种场景处理:
场景1:<NA>是字符串类型(单元格内容为'<NA>')
直接全局替换,避免正则误匹配:
import pandas as pd import numpy as np # 替换所有'<NA>'字符串为np.nan,不影响浮点数和正常字符串 df = df.replace('<NA>', np.nan, regex=False)
场景2:<NA>是Pandas原生缺失值pd.NA(比如列是StringDtype/Int64Dtype)
如果要统一转为np.nan,可直接填充;若只想处理数值列,就针对性操作:
# 全局将pd.NA转为np.nan df = df.fillna(np.nan) # 仅处理数值列,保留字符串列的原生缺失值 numeric_cols = df.select_dtypes(include=['float64', 'int64']).columns df[numeric_cols] = df[numeric_cols].fillna(np.nan)
二、解决to_dict('list')出现''和<NA>的问题
1. 处理空字符串''
提前将DataFrame里的空字符串替换为nan:
df = df.replace('', np.nan, regex=False)
2. 处理<NA>(原生缺失值转字典时的显示)
如果列是StringDtype,pd.NA转字典时会显示为'<NA>',可以先把列转为object类型(让pd.NA自动转为np.nan)再转字典:
# 转为object类型后再转字典 df_obj = df.astype(object) result_dict = df_obj.to_dict('list')
或者转字典后手动遍历处理:
result_dict = df.to_dict('list') # 遍历每个列表,替换pd.NA和空字符串为nan for col, lst in result_dict.items(): result_dict[col] = [np.nan if x in (pd.NA, '') else x for x in lst]
完整示例
假设你的原始DataFrame是:
data = { 'float_col': [1.5, '<NA>', 3.2, np.nan], 'str_col': ['hello', '<NA>', '', 'world'], 'mixed_col': [42, 'foo', pd.NA, 5.8] } df = pd.DataFrame(data)
执行以下代码即可完成所有需求:
# 1. 替换'<NA>'和空字符串为nan df = df.replace({'<NA>': np.nan, '': np.nan}, regex=False) # 2. 处理pd.NA缺失值 df = df.fillna(np.nan) # 3. 转字典 result_dict = df.to_dict('list')
内容的提问来源于stack exchange,提问作者Telis
相关产品推荐
相关产品推荐

