基于pid索引与score列匹配筛选Pandas中df2的目标行
没问题,这事儿好办!我们可以用Pandas的两种常用方法来实现你的需求,精准保留df2中与df1在pid索引和score值都匹配的行,下面给你详细拆解:
方法1:使用
merge做内连接匹配 这是最直接的方案,通过将两个DataFrame在pid和score列上做内连接,自动筛选出两边都存在的匹配项:
import pandas as pd # 先构造示例数据(方便你直接测试) df1 = pd.DataFrame({ 'pid': [100, 101, 101, 200], 'Name': ['Ram', 'Tony', 'Jack', 'Jill'], 'score': [3, 2, 4, 6], 'age': [36, 40, 56, 30] }).set_index('pid') df2 = pd.DataFrame({ 'pid': [100, 101, 101, 101, 200], 'Name': ['Ram', 'Tony', 'John', 'Jack', 'Jill'], 'score': [3, 2, 4, 9, 6], 'age': [36, 40, 51, 32, 30] }).set_index('pid') # 执行内连接:只保留df2中与df1 pid和score都匹配的行 filtered_df2 = pd.merge(df2, df1[['score']], on=['pid', 'score'], how='inner') print(filtered_df2)
输出结果如下:
Name score age pid 100 Ram 3 36 101 Tony 2 40
小解释:
- 我们只取df1的
score列参与匹配(其他列不需要用来判断一致性) how='inner'参数确保只保留两边完全匹配的行,刚好符合你的预期。
方法2:使用布尔索引+元组集合
如果你想更灵活控制筛选逻辑,可以把df1的pid和score组合成元组集合,再逐一检查df2的行是否符合:
# 创建df1的pid+score匹配元组集合 match_pairs = set(zip(df1.index, df1['score'])) # 筛选df2中符合条件的行 filtered_df2 = df2[df2.apply(lambda row: (row.name, row['score']) in match_pairs, axis=1)] print(filtered_df2)
这个方法的输出和上面完全一致,适合需要自定义筛选规则的场景。
内容的提问来源于stack exchange,提问作者Jithesh Erancheri
相关产品推荐
相关产品推荐

