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

如何使用Pandas优化DataFrame中的嵌套循环?

优化嵌套循环的Pandas数据匹配逻辑,提升运行效率

当前代码通过两层嵌套循环匹配df_MailBox_Total和df_SentMail_Service中的邮件ID,为缺失ReceivedOrgId的行补充对应OrgID,但嵌套循环导致运行效率极低,以下是优化方案,同时保留统计成功匹配数量(变量l)的需求:

原代码

l=0
for i in df_MailBox_Total.index : 
    if pd.isnull(df_MailBox_Total.at[i,'ReceivedOrgId']):
        for j in df_SentMail_Service.index :
            if df_MailBox_Total.at[i,'MailId'] == df_SentMail_Service.at[j,'MailID']:
               df_MailBox_Total.at[i,'ReceivedOrgId'] =df_SentMail_Service.at[j,'OrgID']
               l=l+1
               break;

优化方案

方案1:映射字典批量匹配(推荐)

利用字典实现O(1)时间复杂度的查找,大幅降低运行时间:

# 构建MailID到OrgID的映射字典
mail_org_map = df_SentMail_Service.set_index('MailID')['OrgID'].to_dict()

# 筛选需要填充的行
fill_mask = df_MailBox_Total['ReceivedOrgId'].isna()

# 批量匹配并获取有效值
matched_orgs = df_MailBox_Total.loc[fill_mask, 'MailId'].map(mail_org_map)
valid_matches = matched_orgs.notna()

# 填充原DataFrame
df_MailBox_Total.loc[fill_mask & valid_matches, 'ReceivedOrgId'] = matched_orgs[valid_matches]

# 统计成功匹配数量
l = valid_matches.sum()

方案2:Merge+Update 原生Pandas操作

通过关联数据表批量更新,代码更简洁:

# 提取需要补充的行
need_fill = df_MailBox_Total[df_MailBox_Total['ReceivedOrgId'].isna()]

# 关联两个表获取匹配的OrgID
merged = need_fill.merge(
    df_SentMail_Service[['MailID', 'OrgID']],
    left_on='MailId',
    right_on='MailID',
    how='left'
).dropna(subset=['OrgID'])

# 更新原数据表
df_MailBox_Total.loc[merged.index, 'ReceivedOrgId'] = merged['OrgID']

# 统计成功匹配数量
l = len(merged)

优化说明

原代码时间复杂度为O(n*m)(n和m分别为两个DataFrame的行数),优化后时间复杂度降至O(n+m),数据量越大,效率提升越显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:32:33