如何基于两列组合条件删除pandas中的指定行?
正确删除pandas中指定年月组合行的方法
错误原因
你使用的过滤条件(foo.Month != 1) & (foo.Year != 2020)逻辑是「保留同时满足月份不等于1、且年份不等于2020的行」,会把所有2020年的行、所有1月的行都排除,和你只删除2020年1月的需求不符。
解决方案
方法1:对删除条件直接取反(最直观)
我们要删除的是同时满足Month=1且Year=2020的行,只要对这个删除条件整体取反即可:
foo = foo[~((foo['Month'] == 1) & (foo['Year'] == 2020))]
方法2:用逻辑规则改写条件
根据德摩根定律,非(A且B) = 非A或非B,上面的条件也可以改写为:
foo = foo[(foo['Month'] != 1) | (foo['Year'] != 2020)]
注意这里用的是或运算符|,不是你之前使用的且运算符&。
方法3:多组合删除场景通用写法
如果后续需要删除多个年月组合,可以把要删除的组合存为元组列表,用isin批量判断,扩展性更强:
# 可随时新增多个需要删除的年月组合 to_drop = [(1, 2020)] foo = foo[~foo[['Month', 'Year']].apply(tuple, axis=1).isin(to_drop)]
以上三种方法执行后,都会仅删除2020年1月的对应行,保留其余所有数据,输出结果如下:
Month Year 1 2 2020 2 3 2020 3 4 2020 4 5 2020 5 6 2020 6 7 2020 7 8 2020 8 9 2020 9 10 2020 10 11 2020 11 12 2020 12 1 2021 13 2 2021 14 3 2021 15 4 2021 16 5 2021
内容的提问来源于stack exchange,提问作者Denzyl
相关产品推荐
相关产品推荐

