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

Pandas DataFrame:如何将每行中的嵌套字典列表拆分至独立列?

解决嵌套JSON列拆分问题

我来帮你搞定这个嵌套结构的拆分需求!你的VALUE_STRING列是经过HTML转义的JSON字符串,里面还嵌套了expressions列表,我们可以分几步把它拆成你想要的独立列:

步骤1:解析转义的JSON字符串

首先,我们需要把带"的转义字符串还原成标准JSON,再转换成Python字典/列表对象:

import pandas as pd
import json
from html import unescape

# 你的原始数据构造代码
USERNAME = ['root', 'user1', 'user2','user3']
test_data = '[{"conjunction":"and","expressions":[{"_actualOperator":"contains","_actualValue":"LBD","attr":"displayName","op":"contains","value":"LBD"}],"name":"test_Event","editable":true}]'
test_data2 = '[{"conjunction":"and","expressions":[{"_actualOperator":"not_contains","_actualValue":"AAA","attr":"Event","op":"contains","value":"LBD"}],"name":"test_Event","editable":true}]'
test_data3 = '[{"conjunction":"and","expressions":[{"_actualOperator":"exclude","_actualValue":"BBB","attr":"Event","op":"contains","value":"LBD"}],"name":"test_Event","editable":true}]'
test_data4 = '[{"conjunction":"and","expressions":[{"_actualOperator":"adding","_actualValue":"CASA","attr":"displayName","op":"contains","value":"LBD"}],"name":"test_Event","editable":true}]'
VALUE_STRING = [test_data, test_data2, test_data3, test_data4]
data = {'USERNAME': USERNAME, 'VALUE_STRING' : VALUE_STRING}
df = pd.DataFrame(data)

# 解析JSON:先还原转义字符,再转成Python对象
df['parsed_data'] = df['VALUE_STRING'].apply(lambda x: json.loads(unescape(x))[0])

这里用html.unescape()把"转换成",再用json.loads()解析成列表,最后取第一个元素(因为每个字符串都是单元素数组)。

步骤2:提取嵌套的expressions字段并展开

接下来用pd.json_normalize来解析parsed_data里的嵌套内容,重点提取expressions列表中的字段:

# 解析嵌套的expressions
expressions_df = pd.json_normalize(df['parsed_data'], record_path='expressions')

# 合并原USERNAME列和提取出的目标字段
result_df = pd.concat([df['USERNAME'], expressions_df[['_actualOperator', '_actualValue', 'attr']]], axis=1)

步骤3:查看最终结果

现在result_df就是你想要的格式了:

print(result_df)

输出结果:

USERNAME _actualOperator _actualValue        attr
0     root        contains          LBD  displayName
1    user1    not_contains          AAA        Event
2    user2         exclude          BBB        Event
3    user3          adding         CASA  displayName

简化版代码(一步到位)

如果你想更简洁,也可以把步骤合并成一行:

result_df = pd.concat([
    df['USERNAME'],
    pd.json_normalize(
        df['VALUE_STRING'].apply(lambda x: json.loads(unescape(x))[0]),
        record_path='expressions'
    )[['_actualOperator', '_actualValue', 'attr']]
], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:24:07