我有一个数据框,我希望在该数据框中使用即将出现的第一行来回填所有NaN值。我现在的代码是这样:
df[df.applymap(np.isfinite).all(1)]
当我将数据框减少到7列或更少时,此方法有效。但是,当我尝试在具有更多列的数据框上运行此命令时,我返回了一个仅包含列标题的空数据框。
这是怎么回事?我的数据框有800行。
答案 0 :(得分:1)
这完全是您在all
条件下应该得到的。考虑这个最小的例子:
df = pd.DataFrame([[1, 2, np.inf],
[4, np.inf, 6]])
res1 = df[df.iloc[:, :2].applymap(np.isfinite).all(1)] # test first 2 columns only
res2 = df[df.applymap(np.isfinite).all(1)] # test all columns
print(len(res1.index)) # 1
print(len(res2.index)) # 0
df.iloc[:, :2]
过滤器仅用于前两列,并且很明显,第一行将保留。而在第二种情况下,由于考虑了 all 列,因此排除了两行。
顺便说一句,在这种情况下,np.isfinite(df).all(1)
更为惯用:您不必通过applymap
对每个值分别应用运算。
答案 1 :(得分:0)
让我们在这里查看您的代码。 df.applymap(np.isfinite).all(1)是一个具有与原始数据帧相同的索引的序列,并且每个元素都是True或False,这取决于所有列是否为有限列。您可以将此系列用作屏蔽来过滤原始数据帧。如果结果数据框为空,则表示您的序列充满了错误。换句话说,每一行都有至少一个不是有限的值。