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