You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:07:15