如何将现有Pandas DataFrame的所有值设置为零?

如何将现有Pandas DataFrame的所有值设置为零?,第1张

如何将现有Pandas DataFrame的所有值设置为零?

也可以保留的绝对最快的方法

dtypes
如下:

for col in df.columns:    df[col].values[:] = 0

这将直接写入每个列的基础numpy数组。我怀疑其他任何方法都不会比这更快,因为这不会分配额外的存储空间并且不会通过熊猫的

dtype
处理。您也
np.issubdtype
可以只将数字列清零。如果您有混合的
dtype
Dataframe,这可能就是您想要的,但是,如果您的Dataframe已经是完全数字的,那么这当然不是必需的。

for col in df.columns:    if np.issubdtype(df[col].dtype, np.number):        df[col].values[:] = 0

对于小型Dataframe,子类型检查会花费一些成本。但是,将非数字列清零的成本非常高,因此,如果不确定Dataframe是否完全为数字,则可能应包括

issubdtype
检查。


时序比较设定
import pandas as pdimport numpy as npdef make_df(n, only_numeric):    series = [        pd.Series(range(n), name="int", dtype=int),        pd.Series(range(n), name="float", dtype=float),    ]    if only_numeric:        series.extend( [     pd.Series(range(n, 2 * n), name="int2", dtype=int),     pd.Series(range(n, 2 * n), name="float2", dtype=float), ]        )    else:        series.extend( [     pd.date_range(start="1970-1-1", freq="T", periods=n, name="dt")     .to_series()     .reset_index(drop=True),     pd.Series(         [chr((i % 26) + 65) for i in range(n)],         name="string",         dtype="object",     ), ]        )    return pd.concat(series, axis=1)
>>> make_df(5, True)   int  float  int2  float20    0    0.0     5     5.01    1    1.0     6     6.02    2    2.0     7     7.03    3    3.0     8     8.04    4    4.0     9     9.0>>> make_df(5, False)   int  float       dt string0    0    0.0 1970-01-01 00:00:00      A1    1    1.0 1970-01-01 00:01:00      B2    2    2.0 1970-01-01 00:02:00      C3    3    3.0 1970-01-01 00:03:00      D4    4    4.0 1970-01-01 00:04:00      E
数据
n = 10_000# Numeric df, no issubdtype check%%timeit df = make_df(n, True)for col in df.columns:    df[col].values[:] = 036.1 µs ± 510 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)# Numeric df, yes issubdtype check%%timeit df = make_df(n, True)for col in df.columns:    if np.issubdtype(df[col].dtype, np.number):        df[col].values[:] = 053 µs ± 645 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)# Non-numeric df, no issubdtype check%%timeit df = make_df(n, False)for col in df.columns:    df[col].values[:] = 0113 µs ± 391 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)# Non-numeric df, yes issubdtype check%%timeit df = make_df(n, False)for col in df.columns:    if np.issubdtype(df[col].dtype, np.number):        df[col].values[:] = 039.4 µs ± 1.91 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
大数据框
n = 10_000_000# Numeric df, no issubdtype check%%timeit df = make_df(n, True)for col in df.columns:    df[col].values[:] = 038.7 ms ± 151 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)# Numeric df, yes issubdtype check%%timeit df = make_df(n, True)for col in df.columns:    if np.issubdtype(df[col].dtype, np.number):        df[col].values[:] = 039.1 ms ± 556 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)# Non-numeric df, no issubdtype check%%timeit df = make_df(n, False)for col in df.columns:    df[col].values[:] = 099.5 ms ± 748 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)# Non-numeric df, yes issubdtype check%%timeit df = make_df(n, False)for col in df.columns:    if np.issubdtype(df[col].dtype, np.number):        df[col].values[:] = 017.8 ms ± 228 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

我之前曾建议过以下答案,但现在我认为这是有害的-它比上述答案慢得多,也很难推理。 它唯一的优点是写得更好。

最干净的方法是使用裸冒号引用整个数据框。

df[:] = 0

不幸的是,

dtype
情况有点模糊,因为结果数据帧中的每一列都将具有相同的值
dtype
。如果的每一列
df
都是原来的
float
,则新列
dtypes
仍然是
float
。但是,如果一列是
int
object
,似乎新的
dtypes
意愿 可以
int



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5629755.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存