如何使用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
相关产品推荐
相关产品推荐

