编辑 3:为一些已发布的答案添加 %timeit
样本:
n = np.arange(900000).reshape(300000, 3)
df = pd.DataFrame(n, columns = list('abc'))
%timeit 结果:
In [19]: %timeit pd.DataFrame().reindex_like(df).fillna(True)
336 ms ± 13.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [20]: %timeit ~df.eq(np.nan)
2.7 ms ± 175 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [21]: %timeit df.where(df.isna()).fillna(True)
332 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [22]: %%timeit
...: df1=df.copy()
...: df1[:]=True
...:
7.39 ms ± 339 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
所以,~df.eq(np.nan) 是最快的
编辑 2: 使用“NaN”的特殊功能添加另一个方法,即NaN == NaN return False。因此,将整个df 与NaN 进行比较。它将返回所有False。然后,使用否定运算符'~' 将所有内容变为True
~df.eq(np.nan)
Out[1386]:
a b c
0 True True True
1 True True True
2 True True True
编辑:(添加说明)
df.where 和 series.where 上的文档
df.isna 在NaN 上返回True,在non-NaN 上返回False。我使用df.isna 创建一个布尔掩码以与.where 一起使用。在掩码True 上,.where 保持相同的值,即NaN。在掩码 False 上,.where 替换为 replaced-value。我没有指定replaced-value,所以.where 默认为NaN。
这意味着整个df 将转向所有NaN,无论它具有什么值。最后,fillna 到 True
此方法适用于数据框和系列
IIUC,您想从当前的 df 创建一个 new_df,其中所有值都变为 True。如果是这种情况,则不需要函数。
一个简单的方法应该可以工作:
样本数据:
df:
a b c
0 0 1 2
1 3 4 5
2 6 7 8
df.where(df.isna()).fillna(True)
Out[1374]:
a b c
0 True True True
1 True True True
2 True True True