Python中使用groupby将pandas DataFrame转换为嵌套字典的方法
实现代码
首先若需要size字段和目标结构一致为数字类型,可先做类型转换,核心转换逻辑如下:
import pandas as pd # 原始DataFrame定义 my_df = pd.DataFrame( [["123456", "a", "80", False, "beta", None, None], ["123456", "b", "80", False, "beta", None, None], ["7891011", "a", "80", False, "beta", None, None], ["7891011", "b", "80", False, "beta", None, None]], columns = ["device", "variable", "size", "manual", "method","nrow", "ncol"] ) # 可选:将size从字符串转为整数 my_df['size'] = my_df['size'].astype(int) # 基于groupby的转换代码 result = my_df.groupby('device').apply( lambda df: df.set_index('variable')[['size', 'manual', 'method', 'nrow', 'ncol']].to_dict('index') ).to_dict()
运行后输出的result完全符合你需要的嵌套字典结构。
原代码问题说明
你之前尝试的my_df.groupby(["device", "variable"]).apply(list).to_dict()会生成键为(device, variable)元组、值为行内容列表的单层字典,和要求的两层嵌套结构不符。上述方案先按第一层键device分组,每个分组内再把variable设为第二层键,剩余字段作为属性字典,正好匹配目标结构。
更高效率的替代方案(无需groupby)
如果数据量较大,用多级索引配合字典推导式的性能会更优:
my_df = my_df.set_index(['device', 'variable']) result = { dev: my_df.xs(dev, level='device')[['size', 'manual', 'method', 'nrow', 'ncol']].to_dict('index') for dev in my_df.index.unique(level='device') }
内容的提问来源于stack exchange,提问作者eduardokapp
相关产品推荐
相关产品推荐

