如何将嵌套字典列表转换为指定格式的Pandas DataFrame?
优雅实现嵌套字典列表转分组聚合的Pandas DataFrame
我来给你一个简洁高效的方案,完美解决你提取动态水果名称(优先复数名)并按parent_id分组展示不同origin对应水果的需求:
步骤拆解
- 展开嵌套字典:用Pandas的
json_normalize快速把嵌套的fruit字段平展到顶层,避免手动循环处理嵌套结构。 - 生成动态显示名称:创建一个新字段,优先使用
plural_name,如果该字段为空则 fallback 到name,实现动态取数。 - 分组聚合去重:按
parent_id和origin分组,聚合显示名称并自动去重,确保每组只保留唯一的水果名称。 - 整理成目标格式:可根据需要调整输出结构,比如把同一
parent_id下的不同origin结果合并展示。
完整代码实现
import pandas as pd # 你的原始数据 fruit_list = [ {"id": 1, "fruit": {"parent_id": 1, "name": "Banana", "origin": "Brazil"}}, {"id": 2, "fruit": {"parent_id": 1, "name": "Banana", "plural_name": "Bananas", "origin": "Africa"}}, {"id": 3, "fruit": {"parent_id": 2, "name": "Orange", "origin": "Africa"}}, {"id": 4, "fruit": {"parent_id": 2, "name": "Orange", "origin": "Africa"}}, {"id": 5, "fruit": {"parent_id": 3, "name": "Apple", "plural_name": "Apples", "origin": "Africa"}}, {"id": 6, "fruit": {"parent_id": 3, "name": "Apple", "plural_name": "Apples", "origin": "Brazil"}} ] # 步骤1:展开嵌套字典 df = pd.json_normalize(fruit_list) # 步骤2:生成动态显示名称(优先复数名,无则用普通名) df["display_name"] = df["fruit.plural_name"].fillna(df["fruit.name"]) # 步骤3:分组聚合,按parent_id和origin分组,去重后合并名称 result_df = df.groupby(["fruit.parent_id", "fruit.origin"])["display_name"].unique().reset_index() # 可选:把名称列表转成字符串(如果需要更友好的展示格式) result_df["display_name"] = result_df["display_name"].apply(lambda x: ", ".join(x)) # 重命名列名更直观 result_df = result_df.rename(columns={ "fruit.parent_id": "parent_id", "fruit.origin": "origin", "display_name": "fruit_name" }) print(result_df)
输出结果
parent_id origin fruit_name 0 1 Africa Bananas 1 1 Brazil Banana 2 2 Africa Orange 3 3 Africa Apples 4 3 Brazil Apples
方案优势
- 高效简洁:用
json_normalize替代手动循环,处理嵌套数据更高效且代码更简洁。 - 动态适配:通过
fillna自动判断是否使用复数名,无需写复杂的条件判断。 - 灵活扩展:分组聚合逻辑清晰,后续如果需要调整分组维度或聚合方式,只需修改
groupby和聚合函数即可。
内容的提问来源于stack exchange,提问作者Artulo
相关产品推荐
相关产品推荐

