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

Python中匹配两个DataFrame字段的双层for循环如何优化提速?

优化方案说明

你原来的双重循环时间复杂度为O(M*N),两个4万行的表运算量高达16亿次,Python原生循环执行效率低,跑5小时是正常现象。用Pandas向量化合并操作可以把时间复杂度降到接近线性,全程仅需几秒到几十秒就能完成运算,逻辑和你原代码完全对齐。


完整实现代码

import pandas as pd
import numpy as np

# 1. 生成匹配用的辅助列:对x、y做取整处理,和原逻辑一致
red_masked_tracks['x_round'] = red_masked_tracks['x'].round()
red_masked_tracks['y_round'] = red_masked_tracks['y'].round()
green_masked_tracks['x_round'] = green_masked_tracks['x'].round()
green_masked_tracks['y_round'] = green_masked_tracks['y'].round()

# 2. 对红表按匹配键去重,保留第一个出现的行,和原代码break的逻辑对齐
red_unique = red_masked_tracks.drop_duplicates(
    subset=['frame', 'x_round', 'y_round'], 
    keep='first'
)

# 3. 按三个字段做合并
# 如果需要保留绿表所有行、未匹配项留0,把how参数改成'left'即可
merged_df = pd.merge(
    green_masked_tracks,
    red_unique[['frame', 'x_round', 'y_round', 'x', 'y', 'particle', 'mass']],
    on=['frame', 'x_round', 'y_round'],
    how='inner',
    suffixes=('_green', '_red')
)

# 如果用了left合并,新增这行把空值填为0,和原代码初始化逻辑一致
# merged_df = merged_df.fillna(0)

# 4. 提取目标数组,和你原代码输出完全对应
intensity = merged_df[['mass_red', 'mass_green']].values
location = merged_df[['x', 'y']].values
frame = merged_df[['frame']].values
particle = merged_df[['particle']].values

注意事项

如果匹配结果和预期不一致,优先检查两个表的frame、x_round、y_round三个字段的数据类型是否一致,统一转成int类型后再合并即可避免匹配错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:36:01