
本文介绍如何在 Pandas 中高效创建一个新列,其每个元素为字典:字典的键来自当前行的列表列(如 'Related Items'),值则通过键在 DataFrame 全局 'Item' 列中查找对应 'Quantity' 得到。核心是避免低效的 iterrows() 或重复 df.loc 查询,改用一次构建的哈希查找字典 + apply() 实现高性能映射。
本文介绍如何在 pandas 中高效创建一个新列,其每个元素为字典:字典的键来自当前行的列表列(如 `'related items'`),值则通过键在 dataframe 全局 `'item'` 列中查找对应 `'quantity'` 得到。核心是避免低效的 `iterrows()` 或重复 `df.loc` 查询,改用一次构建的哈希查找字典 + `apply()` 实现高性能映射。
在数据处理中,常需根据某列中的“关联项列表”,从同一 DataFrame 的其他行中提取对应字段值,并组织为字典结构(例如用于后续函数调用)。直接在 apply() 中对每行执行 df.loc[df['Item'] == item] 会导致 O(n²) 时间复杂度——每次查找都扫描全表,严重拖慢性能,尤其在数十万行规模下(如原文中 70 万行实测耗时近 20 秒)。
更优解是分离查找逻辑与遍历逻辑:先用 df.set_index('Item')['Quantity'].to_dict() 构建一个 O(1) 平均时间复杂度的键值映射字典;再在 apply() 中复用该字典完成快速查值。这不仅语义清晰,且实测比逐行 loc 查找快约 1.7 倍(11.4s vs 19.5s / 100 次迭代)。
以下是完整实现:
import pandas as pd
# 示例数据
df = pd.DataFrame({
'Item': ['Flowers', 'Bushes', 'Cars', 'Trucks', 'Motorcycles'],
'Quantity': [1, 2, 3, 4, 5],
'Related Items': [
['Bushes'],
['Flowers'],
['Trucks', 'Motorcycles'],
['Cars', 'Motorcycles'],
['Cars', 'Trucks']
]
})
# ✅ 步骤1:构建全局查找字典(仅执行一次)
item_to_quantity = df.set_index('Item')['Quantity'].to_dict()
# ✅ 步骤2:定义安全映射函数(自动跳过不存在的项)
def map_related_quantities(row):
return {
item: item_to_quantity[item]
for item in row['Related Items']
if item in item_to_quantity # 防止 KeyError,仅保留有效关联项
}
# ✅ 步骤3:应用到整列(axis=1 表示按行操作)
df['Related Quantities'] = df.apply(map_related_quantities, axis=1)
输出结果完全匹配预期:
Item Quantity Related Items Related Quantities
0 Flowers 1 ['Bushes'] {'Bushes': 2}
1 Bushes 2 ['Flowers'] {'Flowers': 1}
2 Cars 3 ['Trucks', 'Motorcycles'] {'Trucks': 4, 'Motorcycles': 5}
3 Trucks 4 ['Cars', 'Motorcycles'] {'Cars': 3, 'Motorcycles': 5}
4 Motorcycles 5 ['Cars', 'Trucks'] {'Cars': 3, 'Trucks': 4}
关键注意事项:
- ✅ 永远优先使用
.to_dict()而非循环构造字典:df.set_index(...).to_dict()底层由 Cython 优化,比显式for循环快 2–3 倍; - ⚠️ 务必检查键存在性:使用
if item in item_to_quantity或item_to_quantity.get(item),避免因拼写错误或缺失项导致KeyError; - ? 不要在
apply()内部重建查找字典:它应定义在函数外部,确保只构建一次; - ? 若后续还需批量计算(如对
Related Quantities字典求和、加权等),可考虑直接跳过该中间列,用向量化方式聚合——但本例中字典列本身具有明确业务语义(如作为函数参数),保留它反而提升代码可读性与可维护性。
综上,该方案兼顾性能、健壮性与可读性,是 Pandas 中处理“行内列表 → 全局映射 → 字典构造”类任务的标准实践。










