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

请求验证:将DataFrame嵌套JSON列拆分为独立列的Python代码

问题排查与解决方案

原代码核心问题

  1. 未解析JSON字符串:revieweddata列存储的是JSON格式的字符串,原代码直接对字符串调用extract_info函数,试图从中获取query、response等属性,必然抛出属性错误。
  2. 输出结构不符合需求:原代码将每个pill拆分为单独行,但你需要的是在同一行内生成name1、link1、position1、name2等带序号的列,而非行展开。

修正后的完整代码

import pandas as pd
import json
from json.decoder import JSONDecodeError

# 读取原始数据
df = pd.read_csv('raw_data.csv', encoding='utf8')

# 解析JSON列,处理可能的格式错误(比如示例中多余的闭合大括号)
def parse_json(s):
    try:
        s = s.rstrip().rstrip('}')
        return json.loads(s)
    except JSONDecodeError:
        return {}

df['revieweddata'] = df['revieweddata'].apply(parse_json)

# 提取query和response字段,保留pills列表
parsed_base = pd.json_normalize(df['revieweddata'])
df = df.join(parsed_base.drop('pills', axis=1))

# 处理pills列表,生成带序号的列
def process_pills(pills_list):
    pill_dict = {}
    if not pills_list:
        return pill_dict
    for idx, pill in enumerate(pills_list, 1):
        pill_dict[f'name{idx}'] = pill.get('name')
        pill_dict[f'link{idx}'] = pill.get('link')
        pill_dict[f'position{idx}'] = pill.get('position')
    return pd.Series(pill_dict)

pills_df = parsed_base['pills'].apply(process_pills)
df = df.join(pills_df)

# 清理不需要的列(可选)
df = df.drop('revieweddata', axis=1)

# 查看结果
print(df.head())

代码说明

  • JSON解析:通过parse_json函数将字符串转为JSON对象,同时修复了示例中多余的闭合大括号问题,避免解析报错。
  • 基础字段提取:用pd.json_normalize快速提取query和response,简化代码逻辑。
  • Pills列转换:遍历每个pills列表,将每个pill的字段按序号命名(如name1、link1),生成新列并合并到原DataFrame,完全匹配你的需求。

内容的提问来源于stack exchange,提问作者Jo-Achna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:37:19