如何用Pandas从第二个DataFrame过滤原DataFrame两列值并保留索引
解决方案:按(X,Y)配对过滤DataFrame并保留原ID索引
我来帮你搞定这个需求——要根据第二个DataFrame里的(X,Y)配对组合,过滤第一个DataFrame,同时保留原ID索引,这里有两种实用的pandas方法:
方法一:使用merge(高效适合大数据量)
merge是pandas里处理多列匹配的利器,通过内连接(inner join)可以精准筛选出同时存在于两个DataFrame的(X,Y)配对:
# 先把原DataFrame的ID索引转回列(方便merge匹配) df_reset = df.reset_index() # 按X、Y列做内连接,只保留匹配的行 merged_df = df_reset.merge(df2, on=['X', 'Y'], how='inner') # 再把ID设回索引,只保留X、Y列 result = merged_df.set_index('ID')[['X', 'Y']]
运行这段代码后,得到的结果就和你期望的一致:
X Y ID 1 2 23 2 30 2 2 2 5 3 4 90
方法二:使用元组配对+isin(代码简洁直观)
如果不想折腾索引的转换,可以把每一行的(X,Y)转成元组,直接用isin判断是否存在于df2的配对列表中:
# 把df2的X、Y列转成元组列表 target_pairs = list(df2.itertuples(index=False, name=None)) # 过滤原DataFrame中(X,Y)配对在目标列表里的行 result = df[df.apply(lambda row: (row['X'], row['Y']) in target_pairs, axis=1)]
这个方法直接在已设ID为索引的df上操作,输出结果和方法一完全相同。
两种方法对比
- merge方法:底层是向量化操作,处理十万级以上的数据时效率更高,推荐用于大数据场景。
- apply+lambda方法:代码更简洁易懂,适合小数据量或者快速验证需求的场景,但大数据量下速度会慢一些。
内容的提问来源于stack exchange,提问作者Jonathan Pacheco
相关产品推荐
相关产品推荐

