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

