查找仅在某些列中具有值的行

时间:2018-09-10 23:08:06

标签: python pandas subset

我有一个像这样的数据框:

>>> o1.columns

Index([1、2、3、4、5、6,'m1','m2',7,'m3',8,'m4',9],dtype ='object')

我想查找仅包含数据且仅在m1,m2,m3和m4中具有数据的行,但其余列为nan或为空。可能吗?我或多或少地尝试了以下内容:

>>> o11=o1[(1==@nan) && (2==@nan) && (3==@nan) && (4==@nan) && (5==@nan) && (6==@nan) && (7==@nan) && (8==@nan) && (9==@nan) && (o1.m1!=@nan) && (o1.m2!=@nan) && (o1.m3!=@nan) && (o1.m4!=@nan)]

但是它不起作用。尝试过“ pd.query也”。也许我缺少非常简单的东西。谢谢你的帮助。 最好的祝福 Zillur

2 个答案:

答案 0 :(得分:2)

沿第一个轴调用notna / isnaany / all,然后调用掩码和索引。

cols = ['m1', 'm2', 'm3', 'm4']
diff = df.columns.difference(cols).tolist()

df[df[cols].notna().any(1) & df[diff].isna().all(1)]

这是假设您希望m*中的所有数据都不为空,反之亦然。

答案 1 :(得分:1)

给出一个数据框df为:

df = 
         1    2    3    4    5    6    7    8    9   m1   m2    m3   m4
    0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    3  NaN    4  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.5  1.7  1.23  1.6
    4  NaN    1  NaN  NaN    1  NaN  NaN  NaN   12  NaN  NaN   NaN  NaN
    5  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    6  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN    1  1.2   1.2  1.5
    7  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    8  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN
    9  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   NaN  NaN

我们只希望返回索引= 6的行(根据您的要求):

m1 = df[[1,2,3,4,5,6,7,8,9]].isna().sum(axis = 1) == 9

m2 = df[['m1', 'm2', 'm3', 'm4']].isna().sum(axis = 1) == 0

df[m1 & m2]

输出:

     1    2    3    4    5    6    7    8    9 m1   m2   m3   m4
6  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1  1.2  1.2  1.5