Python Pandas-基于NaN值的组合删除行

Python Pandas-基于NaN值的组合删除行,python,pandas,combinations,dataframe,Python,Pandas,Combinations,Dataframe,我有一个数据框,看起来像这样: 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 在:列F和至少一个其他列a-E中

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

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
在:列F和至少一个其他列a-E中始终存在非NaN值

我想创建一个子表,其中只包含那些在列中包含某些非NaN值组合的行。有许多这样的理想组合,包括双胎和三胎。下面是我想要拉的三个这样的组合的例子:

A列和B列中包含非NaN值的行 C&D中包含非NaN值的行 A&B&C中包含非NaN值的行 我已经从这里了解了np.isfinite和pd.notnull命令,但我不知道如何将它们应用于列的组合


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

假设您的数据帧称为df。您可以像这样使用布尔掩码

# Specify column combinations that you want to pull 
combo1 = ['A', 'B'] 

# Select rows in the data frame that have non-NaN values in the combination
# of columns specified above

notmissing = ((df.loc[:, combo1].notnull()))
df = df.loc[notmissing, :] 
在选择非Nan值时,可以使用apply和lambda函数。您可以使用Numpy.isNan验证它是否为Nan值

输出:

  NUM      A      B   C      D      E         F    A_B    C_D  A_B_C
0  p1    NaN -1.183 NaN    NaN    NaN  1.829711 -1.183    NaN -1.183
1  p5    NaN    NaN NaN    NaN  1.267 -1.552721    NaN    NaN    NaN
2  p9  1.138    NaN NaN -1.179    NaN  1.227306  1.138 -1.179  1.138

如果您不需要检查条件情况,您可以检查另一篇文章中解释的其他方法。

很多时候,我们需要在布尔数组上执行逻辑操作,无论是numpy数组还是熊猫系列,作为选择数据帧子集的一部分。为此使用“and”、“or”、“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().
在Python中,当使用“and”、“or”和“not”运算符时,非布尔变量通常被视为True,除非它们表示[]、int0、float0、None等空对象。因此,在Python中使用这些相同的运算符进行数组形式的布尔运算会造成混淆。有些人希望他们只是简单地评估为真

相反,我们应该使用&、|和~

另一种较短但不太灵活的方法是使用any、all或empty


您可以阅读更多有关这方面的内容

如果您添加代码来为其他人重现数据帧,那就太好了。这样,我们就可以直接回答这个问题,而不是花时间试图建立一个示例数据框架。酷。这产生了一条错误消息:ValueError:无法将大小为2的序列复制到尺寸为716的阵列轴。我的数据框有716行…这非常有用。我可以使用它为每个感兴趣的组合创建一个新的数据帧,然后将它们连接在一起。
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().
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
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