如何结合isin与query合并不同结构DataFrame并去重重复行?
解决方案:结合
isin()与query()实现带条件的DataFrame合并与去重 先帮你梳理清楚核心需求:基于Roll No匹配两个结构不同的DataFrame,同时满足年龄、身高的范围条件,最后合并后去除Name和Roll No重复的行。下面是结合isin()和query()的具体实现步骤:
步骤1:筛选符合所有条件的Roll No集合
首先我们需要找出同时满足Roll No匹配、年龄范围、身高范围的有效Roll No。先通过临时关联两个DataFrame,再用query()筛选条件,最后提取唯一的Roll No:
# 临时关联两个DataFrame,只保留判断条件需要的列 temp_merge = df1[['Roll No', 'Age', 'Height']].merge( df2[['Roll No', '10', '15', '110', '170']], on='Roll No', how='inner' ) # 用query()筛选符合年龄、身高条件的行(注意:你提到的df2['12']疑似笔误,这里替换为df2['15'],如果是其他列请自行修改) valid_roll_nos = temp_merge.query( "`10` < Age < `15` and `110` < Height < `170`" )['Roll No'].unique()
注:数字开头的列名必须用反引号包裹,避免Python语法错误。
步骤2:用isin()过滤原始DataFrame
拿到合法的Roll No列表后,用isin()分别筛选df1和df2中对应的行:
# 筛选df1中符合条件的行 filtered_df1 = df1[df1['Roll No'].isin(valid_roll_nos)] # 筛选df2中符合条件的行 filtered_df2 = df2[df2['Roll No'].isin(valid_roll_nos)]
步骤3:合并筛选后的DataFrame
按Roll No合并两个筛选后的DataFrame,你可以根据需求指定要保留的列(下面是示例列,可自行调整):
# 合并并指定需要保留的列 df4 = filtered_df1[['Name', 'Roll No', 'Age', 'Sex', 'Height']].merge( filtered_df2[['Roll No', 'Country', 'Grade', 'Weight', 'Mother Tongue']], on='Roll No', how='inner' )
步骤4:去除Name与Roll No重复的行
最后用drop_duplicates()去除两列都重复的行,keep='first'表示保留第一次出现的行,可根据需求改为keep='last':
# 去重并重置索引 df4 = df4.drop_duplicates(subset=['Name', 'Roll No'], keep='first').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Santhosh Dhaipule Chandrakanth
相关产品推荐
相关产品推荐

