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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:57:48