如何批量拆分DataFrame中JSON格式列level_options为多列?
解决Pandas批量拆分JSON列的问题
你的代码问题分析
- 代码结构混乱:try-except缩进错误,导致遍历逻辑根本没执行到解析和提取的核心部分。
- JSON处理逻辑完全错误:遍历JSON的键(
for i in l)后,错误地对单个键调用pd.normalize_json(正确方法是pd.json_normalize),而且判断条件完全不符合JSON结构——i是键名(比如"marking"、"options"),根本不存在i['options']这种属性。 - 手动维护列表效率低且易出错:逐个提取选项到列表的方式不仅繁琐,还容易因为数据格式不一致(比如有的行只有2个选项)导致索引错位。
正确解决方案
直接用pd.json_normalize批量处理整个列,不需要手动遍历,步骤如下:
步骤1:确保level_options列是可解析的JSON对象
如果该列存储的是字符串格式的JSON,先用json.loads转换为字典:
import json import pandas as pd # 假设你的DataFrame名为df df['level_options'] = df['level_options'].apply(json.loads)
步骤2:批量拆分JSON列
用pd.json_normalize直接处理整个列,自动展开嵌套结构:
# 拆分JSON列 normalized_df = pd.json_normalize(df['level_options']) # 合并原DataFrame和拆分后的结果(可选去掉原level_options列) final_df = pd.concat([df.drop('level_options', axis=1), normalized_df], axis=1)
步骤3:调整列名(匹配你的预期输出)
如果需要保留指定的选项列,确保所有需要的列都存在,不存在的自动补NaN:
# 定义需要保留的目标列 required_cols = ['options.1', 'options.2', 'options.3', 'options.4', 'options.5', 'correct_options'] # 补全缺失的列 for col in required_cols: if col not in normalized_df.columns: normalized_df[col] = pd.NA # 提取目标列并合并到原DataFrame result_df = pd.concat([df.drop('level_options', axis=1), normalized_df[required_cols]], axis=1)
最终效果
运行上述代码后,会得到你预期的输出:
| options.1 | options.2 | options.3 | options.4 | options.5 | correct_options |
|---|---|---|---|---|---|
| Carbon dioxide | Oxygen | Urine | Sweat | NaN | [2] |
| Yes | No | NaN | NaN | NaN | [1] |
额外说明
- 如果你的
level_options列已经是字典类型(不是字符串),可以跳过步骤1的json.loads转换。 pd.json_normalize会自动处理不同行的JSON结构差异,比如有的行只有2个选项,对应的options.3、options.4等列会自动填充NaN,不需要手动判断。
内容的提问来源于stack exchange,提问作者Sumit Singh Chouhan
相关产品推荐
相关产品推荐

