如何以另一个DataFrame为参数,使用Pandas的.drop()方法删除指定行?
用Pandas的drop()方法实现需求的简便方案
先明确核心需求:从df1中删除所有code不在df2中,或者**code在df2中但reply不等于'yes'**的行,最终只保留code在df2中且reply为'yes'的行。
原代码的问题
你的代码存在两个关键问题:
- 运算符优先级错误:
&的优先级高于==和!=,需要给每个比较表达式单独加括号 - 逻辑匹配错误:逐行对比
df1['code']和df2['code']会因为df2的重复值导致匹配逻辑偏离需求,应该基于df2的code集合来判断归属
简便实现方案
方案一:结合布尔索引与drop()
先筛选出需要删除的行的索引,再用drop()移除:
# 获取df2中唯一的code集合 target_codes = df2['code'].unique() # 定义要删除的行的条件:不在目标code集合,或在集合中但reply不是yes drop_condition = ~((df1['code'].isin(target_codes)) & (df1['reply'] == 'yes')) # 删除对应索引的行 df_new = df1.drop(df1[drop_condition].index)
方案二:先获取保留行的索引,drop反向索引
也可以先拿到需要保留的行的索引,再删除其余行:
keep_indices = df1[(df1['code'].isin(df2['code'].unique())) & (df1['reply'] == 'yes')].index df_new = df1.drop(df1.index.difference(keep_indices))
验证结果
运行上述代码后,df_new的结果会符合预期:
code | reply A1 | yes
内容的提问来源于stack exchange,提问作者null92
相关产品推荐
相关产品推荐

