
使用 `pandas.series.dropna()` 清洗数据后再序列化,可彻底避免 nan 导致的 json 解析错误(如 postgresql 报错 “token 'nan' is invalid”)。
在将 Pandas DataFrame 的某一列(如 'identifier')转换为 JSON 字符串时,若该列包含缺失值(NaN),直接调用 json.dumps(df['identifier'].tolist()) 会将 NaN 序列化为字符串 "NaN",而标准 JSON 规范不支持 NaN 字面量——它仅允许 null、true、false、数字、字符串和数组/对象。因此,当该 JSON 被传入 PostgreSQL 等严格解析器时,会抛出类似 DETAIL: Token "NaN" is invalid 的错误。
正确做法是:在序列化前主动剔除缺失值。推荐使用一行简洁、高效的代码:
import json
import pandas as pd
# 示例数据
df = pd.DataFrame({'identifier': ['US00B8KQN827', 'US0530151036', None, 'CA82509L1076', float('nan')]})
# ✅ 安全转换:先 dropna(),再 tolist(),最后 dumps()
json_list = json.dumps(df['identifier'].dropna().tolist())
print(json_list)
# 输出: ["US00B8KQN827", "US0530151036", "CA82509L1076"]⚠️ 注意事项:
- dropna() 默认删除所有 NaN、None 及 pd.NA 值,适用于绝大多数场景;
- 若需保留 None 并将其转为 JSON null(而非完全删除),应改用 df['identifier'].replace({float('nan'): None}).tolist(),再配合 json.dumps(..., allow_nan=False)(但需确保无真实 NaN);
- 避免使用 fillna() 填充占位符(如空字符串),除非业务逻辑明确要求——否则可能污染下游数据语义。
总结:json.dumps(df['identifier'].dropna().tolist()) 是最直接、可靠且符合 JSON 标准的解决方案,兼顾简洁性与健壮性。










