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

如何在Python Pandas中提取DataFrame列中JSON及嵌套JSON为新列

Pandas解析含NaN的JSON列及嵌套JSON展开方案

一、解决COL7的NaN解析错误

出现ValueError: malformed node or string: nan,是因为ast.literal_eval无法直接处理NaN值。可以通过两种方式解决:

方式1:替换NaN为空JSON字符串

先把NaN替换成"{}",再用ast.literal_eval解析:

import pandas as pd
import numpy as np
import ast

# 示例数据
a = pd.DataFrame()
a["COL1"] = [0.0, 800.0]
a["COL2"] = [2, 3]
a["COL3"] = [123, 444]
a["COL4"] = [1500.0, 1600.0]
a["COL5"] = [700.0, 850.0]
a["COL6"] = ['{"account": {"sector": 2, "other": 15}}', np.nan]
a["COL7"] = ['{"value": "ab"}', np.nan]

# 解析COL7
col7_parsed = pd.json_normalize(a['COL7'].fillna('{}').apply(ast.literal_eval))
# 合并到原表
a = pd.concat([a.drop('COL7', axis=1), col7_parsed], axis=1)

方式2:安全解析函数

写一个函数跳过无效值,避免报错:

def safe_parse(s):
    if pd.notna(s):
        try:
            return ast.literal_eval(s)
        except:
            return {}
    return {}

col7_parsed = pd.json_normalize(a['COL7'].apply(safe_parse))
a = pd.concat([a.drop('COL7', axis=1), col7_parsed], axis=1)

二、解析COL6的嵌套JSON

COL6的嵌套JSON可以直接用pd.json_normalize展开,它会自动将嵌套结构转为带点分隔的列名,同样需要先处理NaN:

# 解析COL6
col6_parsed = pd.json_normalize(a['COL6'].fillna('{}').apply(ast.literal_eval))
# 合并到原表
a = pd.concat([a.drop('COL6', axis=1), col6_parsed], axis=1)

针对扩展示例中的多账户嵌套JSON,json_normalize会自动生成account.sector、account.other、account_2.sector等列,完全满足需求。

三、完整批量处理脚本

如果要同时处理COL6和COL7,整合后的代码如下:

import pandas as pd
import numpy as np
import ast

def parse_json_column(series):
    # 统一处理NaN和解析逻辑
    return pd.json_normalize(series.fillna('{}').apply(ast.literal_eval))

# 加载扩展示例数据
df = pd.DataFrame({
    'COL1': [0.0, 0.0, 0.0],
    'COL2': [2, 0, 33],
    'COL3': [2162561990, 2167912785, 599119703],
    'COL4': [1500.0, 500.0, 3500.0],
    'COL5': [750.0, 0.0, 3500.0],
    'COL6': ['{"account": {"sector": 4, "other": 10},\n"account_2": {"sector": 0, "other": 0},\n"account_3": {"sector": 6, "other": 8}}'],
    'COL7': ['{"value": "cc",\n"value_2": 15.58,\n"value_3": 646}']
})

# 解析两列JSON数据
col6_result = parse_json_column(df['COL6'])
col7_result = parse_json_column(df['COL7'])

# 合并所有列
final_df = pd.concat([df.drop(['COL6', 'COL7'], axis=1), col6_result, col7_result], axis=1)
print(final_df)

运行后,嵌套JSON会被完全展开为常规列,NaN值自动保留为空,不影响后续数据处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:55:23