【问题标题】:Pandas better way to get rows that has all columns null except one熊猫更好的方法来获取所有列都为空的行,除了一个
【发布时间】:2018-01-19 07:14:03
【问题描述】:

我有一个包含 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 列之外的所有列(user_idgroup_id)之外的所有列具有 NaN(s) 的所有记录进行子集化

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

【问题讨论】:

  • 您想要 a 到 az 列都是 NaN 的所有行吗?

标签: python pandas


【解决方案1】:
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

【讨论】:

  • 不应该是notnull,我好像找不到notna方法
  • @Null-Hypothesis,较新的 Pandas 版本也有 notna()isna() 方法,对于较旧的 Pandas 版本 - 使用 notnull()isnull()
  • 我怎样才能得到空行到子集尝试 isnull 但是当我检查数字时它没有加起来
  • @Null-Hypothesis,您的意思是那些所有列(前两列除外)都是 NaN 或任何列的行?
  • 是的,尝试了 isnull 但并没有真正起作用。 (前两个除外)
【解决方案2】:

您可以先删除 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

或者如果两列的位置固定在0和1:

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 2011-04-09
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多