我有一个这样的数据框:
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'])
我想检索所有行,当列'a'和'b'是非负数时,但如果缺少任何一行或全部,我想保留它们。
结果应为
a b c d
2 4 5 41 14
3 3 NaN 1 NaN
我已经尝试过了,但它没有给出预期的结果。
df[(df[cols]>0).all(axis=1) | df[cols].isnull().any(axis=1)]
答案 0 :(得分: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
现在你得到“如果他们都是积极的”或“任何都是空的”。你想要“如果他们都是(正面或空的)”。 (将> 0
替换为>=0
以表示非客观性。)
由于NaN不是正面的,我们可以通过翻转条件来简化,并使用像
这样的东西>>> df[~(df[cols] <= 0).any(axis=1)]
a b c d
2 4 5 41 14
3 3 NaN 1 NaN