如何高效生成DataFrame的关联数量字典列?性能优化疑问
Pandas高效生成关联数量列的解决方案
第一步:构建高性能查找映射
先利用你验证的高效方式,基于Item和Quantity列构建全局映射字典,这是整个流程的性能基础:
# 生成Item到Quantity的快速映射字典,70万行数据下性能远优于循环 item_quantity_map = df.set_index('Item')['Quantity'].to_dict()
用apply生成目标列(可行且优于iterrows)
apply调用的函数完全可以访问全局的映射字典(本质是复用整个DataFrame的数量数据),不需要在函数内部重复读取整个DataFrame。示例代码:
def build_related_qty_dict(row): # 遍历当前行的Related Items,用全局映射生成目标字典 return {item: item_quantity_map.get(item, 0) for item in row['Related Items']} # 批量生成Related Quantities列 df['Related Quantities'] = df.apply(build_related_qty_dict, axis=1)
性能上,apply比iterrows()高效很多——iterrows()会逐行返回Series对象,带来大量额外开销;而apply内部做了优化,虽然不是纯向量化,但在大表上的速度提升非常明显。
是否需要生成中间列?
纠结的点可以这样拆解:
- 如果后续的函数可以直接接收
Related Items和全局映射,完全不需要生成中间列,一步到位生成最终列即可,这样能大幅减少内存占用(70万行的字典列会消耗不少内存):def calculate_final_result(row): # 直接在最终列的计算逻辑里生成临时字典 related_qtys = {item: item_quantity_map.get(item, 0) for item in row['Related Items']} # 替换成你的实际业务计算逻辑 return sum(related_qtys.values()) # 示例:求和关联数量 df['Final Result'] = df.apply(calculate_final_result, axis=1) - 性能对比:不生成中间列的速度和生成列差别不大,但内存占用会显著降低,对于大表来说更友好;如果后续需要多次复用
Related Quantities列,那生成一次更划算。
关键性能结论
你测试的set_index转字典的方式是正确的最优解——这种方式利用了Pandas的索引优化,比手动循环构建字典快几个数量级,是整个流程的核心性能保障。
内容的提问来源于stack exchange,提问作者Carter_Leatherman
相关产品推荐
相关产品推荐

