Pandas更好地获取除了一个列之外所有列为null的行

时间:2018-01-18 22:35:32

标签: python pandas

我有一个包含100列的数据框,其中第一列是唯一标识符,第二列是它们所属的组,列的其余部分解释了每个用户的特征。

user_id, group_id, a, b, c,....,az
0001, 1, 23, pro, 5.5, ......, 234
0002, 1, 32, che, 3.3, ......, 342
0003, 2, NaN, NaN, NaN,......., NaN

除了第1列和第2列(NaNuser_id

之外,我想对包含group_id(s)所有列的所有记录进行子集化

一种方法是: df[df['a'].notnull() & (df['b'].notnull()) & (df['c'].notnull())]但是写这样的98列似乎是不合适的。有没有更好的办法?

3 个答案:

答案 0 :(得分:5)

In [197]: df[df.iloc[:, 2:].notna().all(1)]
Out[197]:
   user_id  group_id     a    b    c     az
0        1         1  23.0  pro  5.5  234.0
1        2         1  32.0  che  3.3  342.0

如果user_idgroup_id 始终设置且永远不会是NaN:

In [205]: df[df.notna().sum(1).gt(2)]
Out[205]:
   user_id  group_id     a    b    c     az
0        1         1  23.0  pro  5.5  234.0
1        2         1  32.0  che  3.3  342.0

PS较旧的Pandas版本没有DataFrame.notna()方法 - 在这种情况下使用DataFrame..notnull()方法

<强>更新

选择除前两个列之外的所有列都具有所有NAN值的行:

In [215]: df[df.iloc[:, 2:].isnull().all(1)]
Out[215]:
   user_id  group_id   a    b   c  az
2        3         2 NaN  NaN NaN NaN

答案 1 :(得分:4)

您可以首先删除user_idgroup_id列,测试空值,然后测试子集:

df[df.drop(['user_id', 'group_id'], axis=1).notnull().all(axis=1)]

#   user_id  group_id     a    b    c     az
#0        1         1  23.0  pro  5.5  234.0
#1        2         1  32.0  che  3.3  342.0

或者如果两列&#39;职位固定为0和1:

df[df.iloc[:,2:].notnull().all(axis=1)]

答案 2 :(得分:3)

我将使用dropna + thresh,基本上它会添加每行NaN数的容差。

df.dropna(axis=0,thresh=df.shape[1]-2)
Out[101]: 
   user_id   group_id    a     b     c    az
0        1          1   23   pro   5.5   234
1        2          1   32   che   3.3   342