如何将含嵌套字典列表的结构化列表转换为DataFrame
嵌套字典列表转DataFrame:展开Permissions列的解决方案
假设你的原始数据结构类似这样:
data = [ { "Table Name": "users", "Permissions": [ {"User": "admin", "Access": "read_write"}, {"User": "guest", "Access": "read_only"} ] }, { "Table Name": "orders", "Permissions": [ {"User": "admin", "Access": "full_access"}, {"User": "analyst", "Access": "read_only"} ] } ]
直接用pd.json_normalize(data)会把Permissions保留为字典列表,无法实现每个Table Name对应一条权限记录的需求。这里提供两种可行方案:
方法1:手动遍历展开数据
遍历原始列表,将每个表名与对应的权限字典逐一合并,生成扁平化列表后再转换为DataFrame:
import pandas as pd flattened_data = [] for item in data: table_name = item["Table Name"] for perm in item["Permissions"]: flattened_data.append({"Table Name": table_name, **perm}) df = pd.DataFrame(flattened_data)
输出的DataFrame结构如下:
| Table Name | User | Access |
|---|---|---|
| users | admin | read_write |
| users | guest | read_only |
| orders | admin | full_access |
| orders | analyst | read_only |
方法2:用pandas的explode+json_normalize组合
先拆分Permissions列表为多行,再将权限字典展开为独立列:
import pandas as pd # 先转换为临时DataFrame,此时Permissions为列表列 df_temp = pd.DataFrame(data) # 展开Permissions列表,生成多行记录 df_exploded = df_temp.explode("Permissions", ignore_index=True) # 合并表名列与展开后的权限列 df = pd.concat([df_exploded["Table Name"], pd.json_normalize(df_exploded["Permissions"])], axis=1)
该方法利用pandas内置方法实现,适合处理大规模数据,效率更高,最终结果与方法1完全一致。
内容的提问来源于stack exchange,提问作者Vijay Tripathi
相关产品推荐
相关产品推荐

