最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何将不同长度列表的字典转化成多类别汇总表格
时间:2026-07-02 10:33:00 编辑:袖梨 来源:一聚教程网
本文介绍两种高效方法,将键值为不等长字符串列表的字典(如 {'A': ['CATEGORY 2'], 'B': ['CATEGORY 1', 'CATEGORY 2']})转换为以键为行、所有出现过的类别为列的二元(或标记型)汇总 DataFrame,支持空值自动补零或填充 'x'。
本文介绍两种高效方法,将键值为不等长字符串列表的字典(如 `{'a': ['category 2'], 'b': ['category 1', 'category 2']}`)转换为以键为行、所有出现过的类别为列的二元(或标记型)汇总 dataframe,支持空值自动补零或填充 `'x'`。
在数据分析中,常需将嵌套结构(如字典中每个 key 对应一个类别列表)展平为“宽格式”汇总表,便于可视化或后续统计。原始字典中各列表长度不一(如 'C': [] 为空),直接用 pd.DataFrame.from_dict(..., orient='index') 会导致列对齐失败——因为 pandas 默认按位置展开,而非按类别语义对齐。
✅ 推荐方案一:使用 str.get_dummies()(语义清晰、一行式表达)
import pandas as pdresponse = { 'A': ['CATEGORY 2'], 'B': ['CATEGORY 1', 'CATEGORY 2'], 'C': [], 'D': ['CATEGORY 3'],}# 步骤解析:# 1. 将每个列表用 '|' 连接成字符串(如 ['CATEGORY 1','CATEGORY 2'] → 'CATEGORY 1|CATEGORY 2')# 2. 构建 Series,index 为原始 keys(即 ITEM),便于后续索引对齐# 3. 调用 str.get_dummies() 自动识别所有唯一类别并生成 0/1 矩阵# 4. 可选:replace({1: 'x', 0: ''}) 实现符号化显示(注意:替换后列类型变为 object)out = ( pd.Series(map('|'.join, response.values()), index=response.keys()) .rename_axis('ITEM') .str.get_dummies() .reset_index())print(out)
输出:
ITEM CATEGORY 1 CATEGORY 2 CATEGORY 30 A 0 1 01 B 1 1 02 C 0 0 03 D 0 0 1
若需显示 'x' 而非 1,取消注释 .replace({0: '', 1: 'x'}) 即可(注意:此操作会将数值列转为字符串列,影响数值计算)。
✅ 推荐方案二:字典推导 + pd.DataFrame.from_dict()(逻辑直观、完全可控)
# 构造中间字典:{item: {category: 'X', ...}, ...}# 空列表自动映射为空字典 → 对应行全为 NaN,fillna(0) 或直接保留空intermediate = { k: {v: 'X' for v in lst} for k, lst in response.items()}out = pd.DataFrame.from_dict(intermediate, orient='index') .rename_axis('ITEM') .reset_index() .fillna('') # 将 NaN 替换为空字符串,保持 'X' 标记风格print(out)
输出(带 'X' 标记):
ITEM CATEGORY 1 CATEGORY 2 CATEGORY 30 A X 1 B X X 2 C 3 D X
? 关键注意事项:
- str.get_dummies() 要求输入为字符串 Series;空列表经 '|'.join([]) 得到空字符串 '',get_dummies() 会为其生成全零行,行为稳定。
- 方案二中,fillna('') 应在 reset_index() 后执行,避免索引列被误填。
- 若类别名含特殊字符(如空格、斜杠),get_dummies() 默认能正确处理;但若用于机器学习特征工程,建议提前标准化类别名(如 .str.replace(r's+', '_', regex=True))。
- 两种方法均自动提取全部唯一类别作为列名,无需手动去重或排序;如需固定列顺序,可在最后用 reindex(columns=['ITEM', 'CATEGORY 1', 'CATEGORY 2', 'CATEGORY 3'])。
综上,str.get_dummies() 更简洁且内置健壮性高,适合快速原型;字典推导法则更易调试和定制(如支持多值权重、自定义标记符),适合生产环境灵活扩展。