如何在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
相关产品推荐
相关产品推荐

