根据列值删除pandas数据帧中的行

doo*_*oms 1 python pandas

我有这样的数据帧:

cols = [ 'a','b']
df = pd.DataFrame(data=[[NaN, -1, NaN, 34],[-32, 1, -4, NaN],[4,5,41,14],[3, NaN, 1, NaN]], columns=['a', 'b', 'c', 'd'])
Run Code Online (Sandbox Code Playgroud)

我想检索所有行,当列'a'和'b'是非负的,但如果它们中的任何一个或全部都缺失,我想保留它们.

结果应该是

   a   b   c   d
2  4   5  41  14
3  3 NaN   1 NaN
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它没有给出预期的结果.

df[(df[cols]>0).all(axis=1) | df[cols].isnull().any(axis=1)]
Run Code Online (Sandbox Code Playgroud)

DSM*_*DSM 5

IIUC,你其实想要的

>>> df[((df[cols] > 0) | df[cols].isnull()).all(axis=1)]
   a   b   c   d
2  4   5  41  14
3  3 NaN   1 NaN
Run Code Online (Sandbox Code Playgroud)

现在你得到"如果他们都是积极的"或"任何都是空的".你想要"如果他们都是(正面或空的)".(替换> 0>=0的非负).

由于NaN不是正面的,我们可以通过翻转条件来简化,并使用类似的东西

>>> df[~(df[cols] <= 0).any(axis=1)]
   a   b   c   d
2  4   5  41  14
3  3 NaN   1 NaN
Run Code Online (Sandbox Code Playgroud)