请求验证:将DataFrame嵌套JSON列拆分为独立列的Python代码
问题排查与解决方案
原代码核心问题
- 未解析JSON字符串:
revieweddata列存储的是JSON格式的字符串,原代码直接对字符串调用extract_info函数,试图从中获取query、response等属性,必然抛出属性错误。 - 输出结构不符合需求:原代码将每个
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
相关产品推荐
相关产品推荐

