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'))存在两个问题:
- 当
d是Pandas的缺失值(NaN)时,json.loads()会抛出TypeError(因为它只能解析字符串/字节),生成器遇到异常后会中断或返回无效数据; - 即使没有报错,生成器的方式无法自动对齐不同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}' ] })
用上面的方法处理后,会得到如下结果:
| a | b | c | d | |
|---|---|---|---|---|
| 0 | False | False | NaN | NaN |
| 1 | False | False | True | NaN |
| 2 | NaN | NaN | NaN | NaN |
| 3 | False | NaN | NaN | NaN |
| 4 | True | NaN | NaN | True |
完全符合你的需求,缺失的键会自动填充NaN,有效数据正确展开。
内容的提问来源于stack exchange,提问作者faraa
相关产品推荐
相关产品推荐

