
本文介绍两种高效方法,将键值为变长字符串列表的字典(如 response)转换为宽格式汇总 dataframe,以 item 为行、各类别为列,支持二值标记(0/1)或符号标记(如 'x'),兼容空列表与重复类别。
本文介绍两种高效方法,将键值为变长字符串列表的字典(如 response)转换为宽格式汇总 dataframe,以 item 为行、各类别为列,支持二值标记(0/1)或符号标记(如 'x'),兼容空列表与重复类别。
在数据分析中,常需将嵌套结构(如 dict[str, list[str]])展平为便于可视化或统计的交叉汇总表。给定字典 response 中各键对应不同长度的类别列表(含空列表),目标是生成以键为行索引(ITEM)、所有唯一类别为列名的二值(或符号)标记表。
以下是两种推荐方案,均基于 pandas 实现,简洁、健壮且无需手动处理缺失值:
✅ 方法一:使用 str.get_dummies()(推荐用于大规模数据)
该方法先将每个列表拼接为管道分隔字符串(如 ['CATEGORY 1', 'CATEGORY 2'] → 'CATEGORY 1|CATEGORY 2'),再利用 str.get_dummies() 自动完成 one-hot 编码:
import pandas as pd
response = {
'A': ['CATEGORY 2'],
'B': ['CATEGORY 1', 'CATEGORY 2'],
'C': [],
'D': ['CATEGORY 3'],
}
# 构建 Series 并启用 get_dummies
s = pd.Series(
[('|'.join(v) if v else '') for v in response.values()],
index=response.keys()
).rename_axis('ITEM')
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,追加 .replace({1: 'x', 0: ''}) 即可(注意:'' 是空字符串,非 NaN)。
✅ 方法二:字典推导 + pd.DataFrame.from_dict()
更直观、内存友好,适合中小规模数据。通过字典推导为每个 ITEM 构建映射 {category: 'x'},pandas 自动对齐缺失列并填充 NaN,再统一替换:
df = pd.DataFrame.from_dict(
{k: {v: 'x' for v in vals} for k, vals in response.items()},
orient='index'
).fillna('').rename_axis('ITEM').reset_index()
print(df)输出(已用空字符串填充):
ITEM CATEGORY 1 CATEGORY 2 CATEGORY 3 0 A x 1 B x x 2 C 3 D x
⚠️ 注意事项:
- get_dummies() 默认将空字符串视为空类别,结果全为 0,天然兼容空列表;
- 字典推导法依赖 fillna('') 避免 NaN,若需数值型后续计算,建议保留 0/1 并用 astype(int);
- 列顺序由类别首次出现顺序决定(get_dummies)或字典遍历顺序(推导法),如需固定列序,可在最后用 reindex(columns=['CATEGORY 1', 'CATEGORY 2', 'CATEGORY 3']) 显式指定。
两种方法均无需预定义类别集合,自动识别全部唯一值,鲁棒性强,可直接集成到 ETL 流程中。

















