Skip to main content
 首页 » 编程设计

python之基于具有默认值的形状创建 DataFrame

2025年05月04日21unruledboy

我有一个接收 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