如何将Pandas DataFrame中的嵌套字典转换为列形式?
处理Pandas中嵌套字典列表的内置方法
嘿,这个问题我之前碰到过好多次!不用慌,Pandas确实有高效的内置方法来处理这种嵌套结构,完全不用手动写循环逐行解析,既简洁又高效。
先模拟你的数据
首先咱们先把你描述的结构还原成可测试的示例DataFrame,方便你对应自己的场景:
import pandas as pd # 模拟你的原始数据结构 data = { 'ID': [0, 1, 2], 'Sec Type': [20, 30, 40], 'nested_col': [ [{'id': '3233790e-1f47-403a-bb97-58a14a2f92ab', 'values': [{'number':50, 'level':1}]}], [{'id': 'bbc9852c-ac76-4ecd-9afb-dd371f3bd48b', 'values': [{'number':40, 'level':2}]}], [{'id': 'be5629e0-458d-4aaa-b2f8-77d8ad1b0f7f', 'values': [{'number':30, 'level':3}]}] ] } df = pd.DataFrame(data)
分步解析嵌套结构
咱们分三步就能把嵌套的结构完全展开成常规列:
- 展开外层列表
你的nested_col列里每个元素是长度为1的列表,先用explode把列表展开,让每个字典单独占一行:
df_exploded = df.explode('nested_col', ignore_index=True)
- 用
json_normalize解析嵌套字典
接下来用pd.json_normalize深入解析字典里的嵌套列表,通过record_path指定要展开的内层列表(这里是values),meta参数保留外层的id字段:
# 解析嵌套的values列表,同时保留上层的id normalized_nested = pd.json_normalize(df_exploded['nested_col'], record_path='values', meta='id')
- 合并回原数据
最后把原始的非嵌套列和解析后的结果合并,就得到完全扁平化的DataFrame了:
final_df = pd.concat([df_exploded.drop('nested_col', axis=1), normalized_nested], axis=1)
最终效果
运行完上面的代码,final_df的结构就是你想要的常规列形式:
| ID | Sec Type | id | number | level |
|---|---|---|---|---|
| 0 | 20 | 3233790e-1f47-403a-bb97-58a14a2f92ab | 50 | 1 |
| 1 | 30 | bbc9852c-ac76-4ecd-9afb-dd371f3bd48b | 40 | 2 |
| 2 | 40 | be5629e0-458d-4aaa-b2f8-77d8ad1b0f7f | 30 | 3 |
额外说明
如果你的values列表里有多个元素(比如某一行的values是[{'number':50, 'level':1}, {'number':60, 'level':2}]),这套方法同样适用——json_normalize会自动把每个values元素展开成单独的行,完全不用修改代码。
内容的提问来源于stack exchange,提问作者Keithx
相关产品推荐
相关产品推荐

