也可以保留的绝对最快的方法
dtypes如下:
for col in df.columns: df[col].values[:] = 0
这将直接写入每个列的基础numpy数组。我怀疑其他任何方法都不会比这更快,因为这不会分配额外的存储空间并且不会通过熊猫的
dtype处理。您也
np.issubdtype可以只将数字列清零。如果您有混合的
dtypeDataframe,这可能就是您想要的,但是,如果您的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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)