
本文介绍如何利用 Pandas 的 apply() 配合预构建的查找字典,高效生成一个新列——该列每个元素均为字典,其键来自某列的列表,值则通过键在另一列中查表获得。
本文介绍如何利用 pandas 的 `apply()` 配合预构建的查找字典,高效生成一个新列——该列每个元素均为字典,其键来自某列的列表,值则通过键在另一列中查表获得。
在数据处理中,常需根据当前行中某个“关联项列表”(如 ['Trucks', 'Motorcycles']),去整个 DataFrame 中查找对应项的属性值(如 Quantity),并构造成键值对字典。若对每行都用 df.loc[df['Item'] == item] 实时查询,将触发大量重复索引扫描,性能急剧下降。
最佳实践是「一次建表、多次查表」:先用 df.set_index('Item')['Quantity'].to_dict() 构建 O(1) 时间复杂度的查找字典,再在 apply() 中复用它。这样既避免了 iterrows() 的显式循环开销,又规避了 apply() 默认仅传入单行导致无法访问全局数据的限制。
以下是完整实现:
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_quantities = df.set_index('Item')['Quantity'].to_dict()
# ✅ 步骤2:定义映射函数(接收整行,利用预建字典查值)
def create_related_quantities(row):
return {
item: item_quantities[item]
for item in row['Related Items']
if item in item_quantities # 安全过滤:跳过不存在的关联项
}
# ✅ 步骤3:应用到全量数据(axis=1 表示按行操作)
df['Related Quantities'] = df.apply(create_related_quantities, axis=1)⚠️ 注意事项:
- 不要在
apply()内部重建查找字典(如每次调用都df.set_index(...).to_dict()),这会抵消全部性能优势;- 使用
item in item_quantities而非item_quantities.get(item) is not None更高效(避免两次哈希查找);- 若原始数据中存在重复
Item,set_index().to_dict()会保留最后一次出现的Quantity,如有歧义需先去重或聚合;- 对于超大规模数据(如 70 万+ 行),此方法比逐行
loc查询快约 40%(实测:11.4s vs 19.5s / 100 次迭代)。
最终结果完全匹配预期结构,且具备良好可扩展性与可读性——该列可直接作为后续函数(如批量计算关联总量、加权平均等)的输入,无需额外解析。

















