Pandas - 根据NaN值的组合删除行

Sla*_*ron 0 python combinations dataframe pandas

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

NUM   A      B        C      D        E        F
p1    NaN    -1.183   NaN    NaN      NaN      1.829711
p5    NaN    NaN      NaN    NaN      1.267   -1.552721
p9    1.138  NaN      NaN    -1.179   NaN      1.227306
Run Code Online (Sandbox Code Playgroud)

在以下列中始终存在非NaN值:列F和至少一个其他列AE.

我想创建一个子表,其中只包含那些在列中包含某些非NaN值组合的行.存在许多这些期望的组合,包括双峰和三重峰.以下是我想要提取的三种组合的示例:

  1. 在A列和B列中包含非NaN值的行
  2. 在C&D中包含非NaN值的行
  3. 在A&B和C中包含非NaN值的行

我已经从这个问题中了解了np.isfinite和pd.notnull命令,但我不知道如何将它们应用于列的组合.

此外,一旦我有一个用于删除与我所需组合之一不匹配的行的命令列表,我不知道如果它们与任何所需组合不匹配,我不知道如何告诉Pandas仅删除行.

Pha*_*ani 5

很多时候,我们需要对布尔数组(numpy数组或pandas系列)进行逻辑运算,作为选择数据帧子集的一部分.使用'和','或','not'运算符不起作用.

In [79]: df[pd.notnull(df['A']) and pd.notnull(df['F'])]

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)

在Python中,当使用"和","或"和"不是"的运营商,非布尔变量通常被认为是真实的,除非他们表示类似的"空"的对象[],int(0),float(0),None等,所以,这将是混乱使用这些用于在Pandas中进行数组式布尔运算的相同运算符.有些人会期望他们只是评估True

相反,我们应该使用&,|~这一点.

In [69]: df[pd.notnull(df['A']) & pd.notnull(df['F'])]
Out[69]:
  NUM      A   B   C      D   E         F
2  p9  1.138 NaN NaN -1.179 NaN  1.227306
Run Code Online (Sandbox Code Playgroud)

另一种更短但不太灵活的方法是使用any(),all()empty.

In [78]: df[pd.notnull(df[['A', 'F']]).all(axis=1)]
Out[78]:
  NUM      A   B   C      D   E         F
2  p9  1.138 NaN NaN -1.179 NaN  1.227306
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多相关内容