
本文介绍两种高效方法,将键值为不等长字符串列表的字典(如 {'A': ['CATEGORY 2'], 'B': ['CATEGORY 1', 'CATEGORY 2']})转换为结构清晰的汇总 DataFrame,实现按 ITEM 行、CATEGORY 列的二元(或标记式)交叉统计表。
本文介绍两种高效方法,将键值为不等长字符串列表的字典(如 `{'a': ['category 2'], 'b': ['category 1', 'category 2']}`)转换为结构清晰的汇总 dataframe,实现按 item 行、category 列的二元(或标记式)交叉统计表。
在数据分析中,常需将嵌套结构(如字典中每个 key 对应一个类别列表)展平为“宽表”形式,便于可视化或下游建模。本例目标是:以字典 key(如 'A', 'B')作为行索引 ITEM,所有出现过的类别(如 'CATEGORY 1', 'CATEGORY 2', 'CATEGORY 3')作为列名,单元格标记该 ITEM 是否包含对应 CATEGORY —— 即典型的 one-hot 编码变体。
✅ 方法一:使用 str.get_dummies()(推荐,简洁且健壮)
该方法先将每个列表用 '|'.join 合并为管道分隔字符串,再利用 Pandas 内置的 str.get_dummies() 自动识别全部唯一类别并生成稀疏矩阵:
import pandas as pd
response = {
'A': ['CATEGORY 2'],
'B': ['CATEGORY 1', 'CATEGORY 2'],
'C': [],
'D': ['CATEGORY 3'],
}
# 构建 Series:index 为 ITEM,values 为拼接后的字符串(空列表 → 空字符串)
s = pd.Series(
[('|'.join(v) if v else '') for v in response.values()],
index=response.keys()
).rename_axis('ITEM')
# 一键生成 one-hot 编码 DataFrame,并重置索引
df = s.str.get_dummies(sep='|').reset_index()
print(df)输出:
ITEM CATEGORY 1 CATEGORY 2 CATEGORY 3 0 A 0 1 0 1 B 1 1 0 2 C 0 0 0 3 D 0 0 1
若需显示 'x' 而非 1/0,可追加 .replace({1: 'x', 0: ''})(注意:'' 为空字符串,非 NaN)。
✅ 方法二:字典推导式 + pd.DataFrame.from_dict()
更直观、可控性更强,适合逻辑复杂或需自定义标记的场景:
# 构建嵌套字典:{ITEM: {CATEGORY: 'x'}}
dummy_dict = {
k: {v: 'x' for v in vals}
for k, vals in response.items()
}
df = pd.DataFrame.from_dict(dummy_dict, orient='index').fillna('').rename_axis('ITEM').reset_index()
print(df)输出(自动对齐所有 CATEGORY 列,缺失值填充为空字符串):
ITEM CATEGORY 1 CATEGORY 2 CATEGORY 3 0 A x 1 B x x 2 C 3 D x
⚠️ 注意事项:
- 方法一依赖 get_dummies() 的自动列发现能力,类别名中不能含 | 符号(否则会错误切分);若原始数据含特殊字符,建议先清洗或改用方法二。
- 方法二天然支持任意标记(如 '✓', '✔', True),且 fillna('') 可确保空项显示为空白而非 NaN。
- 若需数值型结果(如用于机器学习),优先选方法一(输出为 int64);若侧重报表展示,方法二更灵活。
两种方案均无需手动提取全部类别、无需预定义列顺序,自动适配输入字典结构,兼顾鲁棒性与可读性,可根据项目需求灵活选用。

















