
本文介绍如何将包含两列的 dataframe 快速、简洁地转换为以第一列为键、第二列为值的 python 字典,推荐使用 `set_index().to_dict()` 组合方法,避免低效迭代。
在 Pandas 数据处理中,常需将二维表格结构(如两列)映射为键值对字典——例如将 ID 列作为键、标签列作为值,用于快速查找或构建配置映射。直接调用 DataFrame.to_dict() 默认返回列名 → 列数据的嵌套字典,无法满足 colA → colB 的扁平映射需求;而使用 iterrows() 配合字典推导式虽可行,但性能较差(涉及 Python 层循环,且 iterrows() 会构造 Series 对象,开销大)。
推荐方案:df.set_index('a')['b'].to_dict() 或等价写法 df.set_index('a').to_dict()['b']
import pandas as pd
df = pd.DataFrame(data={'a': [1, 3], 'b': [2, 4]})
result = df.set_index('a')['b'].to_dict()
print(result) # {1: 2, 3: 4}✅ 优势说明:
- 高效:全程基于 Pandas 内部向量化操作,无显式 Python 循环;
- 简洁:单行链式调用,语义清晰(“以 a 列设索引,取 b 列,转字典”);
- 健壮:自动处理重复键(后出现的值覆盖先出现的),若需检测重复可提前用 df['a'].is_unique 校验。
⚠️ 注意事项:
- 若 a 列含重复值,set_index 不报错但会导致键冲突(仅保留最后一次出现的对应 b 值);
- 若 a 列含 NaN,其对应行将被丢弃(因 set_index 默认 drop=True 且 NaN 不可作为索引键);
- 如需保留 NaN 键或自定义冲突策略,应改用 dict(zip(df['a'], df['b']))(但注意:zip 在遇到 NaN 时仍会保留,且不校验重复)。
补充技巧:
若需反向映射(b → a),只需交换列名:df.set_index('b')['a'].to_dict();
若列名未知,可用位置索引:df.set_index(df.columns[0])[df.columns[1]].to_dict()。
总之,set_index + [] + to_dict 是兼顾可读性、性能与 Pandas 惯例的最佳实践。










