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

Pandas读取JSON列生成多列失败:值全部显示为NaN求助

解决Pandas JSON列转多列全为NaN的问题

你的代码之所以能生成正确的列名但所有值都是NaN,核心问题是没有处理JSON列中的缺失值(NaN),而且直接用生成器遍历的方式遇到非JSON字符串(比如NaN)时会出现解析异常,导致DataFrame无法正确填充数据。下面给你两种可靠的解决方法:

方法一:自定义解析函数 + apply(pd.Series)

这种方法灵活,还能处理解析失败的异常情况:

import json
import pandas as pd

# 定义JSON解析函数,处理缺失值和解析异常
def parse_json(x):
    if pd.isna(x):
        return {}  # 把NaN转换成空字典,避免解析报错
    try:
        return json.loads(x)
    except (json.JSONDecodeError, TypeError):
        # 遇到无法解析的内容时也返回空字典
        return {}

# 解析JSON列并展开为多列,再和原DataFrame拼接
ops = ops.join(ops.pop('json_column').apply(parse_json).apply(pd.Series))

方法二:使用pd.json_normalize(更简洁)

pd.json_normalize专门用来展开嵌套JSON,搭配缺失值处理会更高效:

import json
import pandas as pd

# 先处理缺失值,再解析JSON
json_series = ops.pop('json_column').apply(
    lambda x: {} if pd.isna(x) else json.loads(x)
)

# 用json_normalize展开并拼接
ops = ops.join(pd.json_normalize(json_series))

为什么你的原代码不行?

你原代码里的生成器(json.loads(d) for d in ops.pop('json_column'))存在两个问题:

  1. 当d是Pandas的缺失值(NaN)时,json.loads()会抛出TypeError(因为它只能解析字符串/字节),生成器遇到异常后会中断或返回无效数据;
  2. 即使没有报错,生成器的方式无法自动对齐不同JSON对象的键,导致最终DataFrame无法正确填充值,只会保留所有出现过的键作为列名,但值全为NaN。

测试示例

假设你的初始DataFrame是这样的:

ops = pd.DataFrame({
    'json_column': [
        '{"a":false,"b":false}',
        '{"a":false,"b":false,"c":true}',
        pd.NA,
        '{"a":false}',
        '{"a":true,"d":true}'
    ]
})

用上面的方法处理后,会得到如下结果:

abcd
0FalseFalseNaNNaN
1FalseFalseTrueNaN
2NaNNaNNaNNaN
3FalseNaNNaNNaN
4TrueNaNNaNTrue

完全符合你的需求,缺失的键会自动填充NaN,有效数据正确展开。

内容的提问来源于stack exchange,提问作者faraa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:47:34