不同长度Pandas DataFrame基于多列匹配查询ID差异的高性能方案咨询
高性能Pandas实现方案
直接使用Pandas内置的merge关联+过滤即可实现需求,完全避免嵌套循环,性能远高于Python层循环实现。
实现代码
import pandas as pd # 1. 重命名ID列区分两个表的ID,避免重名冲突 df_g_rename = df_g.rename(columns={'ID': 'ID_g'}) df_n_rename = df_n.rename(columns={'ID': 'ID_n'}) # 2. 以NAME、TYPE、LEN为键做内连接,匹配三列完全相同的行 merged_df = pd.merge(df_n_rename, df_g_rename, on=['NAME', 'TYPE', 'LEN'], how='inner') # 3. 过滤出两个ID不同的行,还原df_n的原始列结构 result = merged_df[merged_df['ID_n'] != merged_df['ID_g']][['NAME', 'ID_n', 'TYPE', 'LEN']].rename(columns={'ID_n': 'ID'}).reset_index(drop=True)
将你给出的示例数据代入以上代码,输出的result和你期望的结果完全一致。
性能说明
- 完全基于Pandas底层C实现的矢量化运算,无Python层面的循环开销
- 针对你提到的1000行、5000行的业务场景,运行耗时在毫秒级,远优于转字典、转数组的循环方案
可选优化
如果你的两个表中NAME+TYPE+LEN存在重复键,可以提前对df_g做去重处理,进一步提升效率:
# 提前对df_g的关联键去重,避免产生冗余笛卡尔积 df_g_unique = df_g_rename.drop_duplicates(subset=['NAME', 'TYPE', 'LEN'], keep='first') merged_df = pd.merge(df_n_rename, df_g_unique, on=['NAME', 'TYPE', 'LEN'], how='inner')
内容的提问来源于stack exchange,提问作者Coli_son
相关产品推荐
相关产品推荐

