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值组合的行.存在许多这些期望的组合,包括双峰和三重峰.以下是我想要提取的三种组合的示例:
我已经从这个问题中了解了np.isfinite和pd.notnull命令,但我不知道如何将它们应用于列的组合.
此外,一旦我有一个用于删除与我所需组合之一不匹配的行的命令列表,我不知道如果它们与任何所需组合不匹配,我不知道如何告诉Pandas仅删除行.
很多时候,我们需要对布尔数组(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)
你可以在这里阅读更多相关内容