如何删除Pandas DataFrame指定多列中含负值的行?
移除DataFrame指定列含负值的行
问题背景
初始DataFrame定义如下:
import pandas as pd ad = pd.DataFrame({'A':[-1,2,3,4],'B':[5,-6,7,8],'C':[1,-2,0,1]})
输出结果:
A B C 0 -1 5 1 1 2 -6 -2 2 3 7 0 3 4 8 -1
需求:删除A、B列中任意一列存在负值的行,预期结果:
A B C 2 3 7 0 3 4 8 -1
初始尝试的问题
最初的写法会导致错误结果:
ad = ad[ad[['A','B']]>0]
执行后生成的DataFrame会把不符合条件的单元格设为NaN:
A B C 0 NaN 5.0 NaN 1 2.0 NaN NaN 2 3.0 7.0 NaN 3 4.0 8.0 NaN
后续执行ad.dropna(how='any',inplace=True)时,只要行内有任意NaN就会被删除,最终得到空DataFrame。
可行解决方案
方案1:Pandas原生方法(all())
利用Pandas的布尔索引结合all()方法,确保指定列的所有值都满足大于0的条件:
print(ad[(ad[['A','B']] > 0).all(1)])
输出符合预期:
A B C 2 3 7 0 3 4 8 1
性能测试(%timeit):
1000 loops, best of 5: 979 µs per loop
方案2:基于NumPy的实现
通过np.logical_and.reduce()实现多列条件的逻辑与判断:
import numpy as np print(ad[np.logical_and.reduce(ad[['A','B']]>0,axis=1)])
输出同样符合预期:
A B C 2 3 7 0 3 4 8 1
性能测试(%timeit):
1000 loops, best of 5: 795 µs per loop
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

