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

如何高效查找一个DataFrame中与另一个DataFrame匹配行的对应索引

优化实现方案

你当前的逐行遍历方案属于O(M*N)复杂度的嵌套查询,数据量较大时性能会很差,我们可以通过预聚合+映射的方式把复杂度降到O(M+N),实现更高效优雅的效果。

方案1:字典映射法(写法最简洁,可读性高)

核心思路是提前把df1中所有相同字段组合对应的索引聚合为列表,生成映射字典后直接匹配给df2:

# 1. 预聚合df1,生成【字段组合→对应索引列表】的映射字典
idx_map = df1.reset_index().groupby(['Name', 'Place', 'Price'])['index'].agg(list).to_dict()

# 2. 为df2匹配索引列表,无匹配则返回空列表
df2['Index'] = df2.apply(
    lambda row: idx_map.get((row['Name'], row['Place'], row['Price']), []),
    axis=1
)

方案2:全向量化merge法(性能最高,适合超大数据集)

如果两个DataFrame的数据量达到十万级以上,可以用完全避免逐行操作的merge方案,性能提升更明显:

# 1. 为df1增加原索引列
df1_with_idx = df1.reset_index(names='orig_idx')

# 2. 按匹配字段关联两个DataFrame,按df2的原索引分组聚合索引列表
merged = df2.reset_index().merge(df1_with_idx, on=['Name', 'Place', 'Price'], how='left')
df2['Index'] = merged.groupby('index')['orig_idx'].agg(
    lambda x: x.dropna().astype(int).tolist()
).tolist()

两种方案运行后得到的df2都完全符合预期输出效果。

内容的提问来源于stack exchange,提问作者Vineet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:15:03