一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何将不同长度列表的字典转化成多类别汇总表格

时间: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() 更简洁且内置健壮性高,适合快速原型;字典推导法则更易调试和定制(如支持多值权重、自定义标记符),适合生产环境灵活扩展。

热门栏目