我有一个接收 df 的函数。 我试图让它返回具有相同形状但默认值的 df(在我的示例中为 True)。
有时我会得到一个系列作为 df(只有一个 col)。
我设法找到了一个系列的东西:
def func(df):
return pd.Series([True for i in range(df.shape[0])])
我还为 df 管理了一个:
def func(df):
return df.apply(lambda x: True)
但这看起来资源太多了,我正试图找到一种快速而优雅的方法来实现这一点。
请您参考如下方法:
编辑 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 返回 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 创建一个 bool 掩码以与 .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
