pandas如何基于两个指定条件筛选df_1中符合要求的行
问题原因
你编写的代码逻辑错误核心在于:df_2.b == 'Yes'是直接对df_2的行按位置和df_1做布尔运算,没有按a列的取值做匹配关联,两个DataFrame长度不一致、索引也没有对齐,完全无法实现你要的按a值关联判断的需求。
解决方法
方法1:先提取符合要求的a值再筛选
先把df_2中b列取值为Yes对应的a值单独提取为集合,再基于这个集合做筛选判断:
import pandas as pd df_1 = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}) df_2 = pd.DataFrame({'a': [2, 4, 6, 8, 10], 'b': ['Yes', 'No', 'Yes', 'No', 'No']}) # 提取df_2中b为Yes的a值集合 allowed_a = set(df_2.loc[df_2['b'] == 'Yes', 'a']) # 按规则筛选:不在df_2的a列中,或者在允许的a值集合中 df = df_1[(~df_1['a'].isin(df_2['a'])) | (df_1['a'].isin(allowed_a))] print(df)
方法2:通过映射字典判断
构建a列到b列的映射字典,直接对df_1的每一行a值做判断:
a_b_map = df_2.set_index('a')['b'].to_dict() df = df_1[df_1['a'].map(lambda x: a_b_map.get(x) in (None, 'Yes'))]
两种方法运行后都可以得到你预期的输出:
a 0 1 1 2 2 3 4 5 3 6 6 7 8 9
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

