如何从嵌套字典高效生成目标分组DataFrame,无需手动构造初始表?
从嵌套字典构建分组编码DataFrame的高效方案
你可以直接使用pandas内置的结构化数据处理接口跳过手动构造初始DataFrame的步骤,两种常用实现方式如下:
方案1:一行代码转换(最简洁)
import pandas as pd encoding_dict = {"Age":{"Middle": 0, "Senior": 1, "Young": 2}, "Sex":{"F": 0, "M": 1}, "BP":{"High": 0, "Low": 1, "Normal": 2}, "Cholesterol":{"High": 0, "Normal": 1}} # 核心转换逻辑,输出和你原代码完全一致的结果 grouped = pd.DataFrame(encoding_dict).stack().swaplevel().sort_index().to_frame(name='Encoding') print(grouped)
逻辑说明
pd.DataFrame(encoding_dict)直接将嵌套字典转为DataFrame,行索引为全部分类值,列名为特征名,不存在的分类对应值为NaN.stack()将列名(特征名)转为二级行索引,同时自动过滤空值,天然适配不同特征分类数量不一致的场景.swaplevel()交换两层索引顺序,将特征名放在第一层索引,匹配目标输出的索引结构.sort_index()对多层索引排序,最终顺序和你手动构造的输出完全一致.to_frame(name='Encoding')将生成的Series转为DataFrame,指定编码列名
方案2:concat拼接(逻辑更直观)
如果你更偏向容易理解的实现逻辑,可以用pd.concat批量拼接每个特征的编码映射:
# 核心转换逻辑 grouped = pd.concat({feature: pd.Series(category_map) for feature, category_map in encoding_dict.items()}).to_frame(name='Encoding') # 给两层索引命名 grouped.index.names = ['Features', 'Categories'] print(grouped)
逻辑说明
通过字典推导式把每个特征的分类编码字典转为Series,再用pd.concat的keys参数给每个特征的Series添加一级索引,直接生成符合要求的多层索引结构。
两种方案都是pandas原生向量化操作,不需要手动拼接任何列表,后续如果特征或分类有增删,不需要修改转换逻辑,自动适配新的映射关系,运行效率远高于手动构造后再分组的方案。
内容的提问来源于stack exchange,提问作者Girish Kumar Chandora
相关产品推荐
相关产品推荐

