创建一个零填充的pandas数据框

164 投票
6 回答
323014 浏览
提问于 2025-04-18 02:01

创建一个指定大小的全零 pandas 数据框,最好的方法是什么?

我使用了:

zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)

有没有更好的方法呢?

6 个回答

3

假设你有一个模板数据表(DataFrame),想要复制这个表并填充零值...

如果你的数据集中没有缺失值(NaNs),那么用零去乘会快很多:

In [19]: columns = ["col{}".format(i) for i in xrange(3000)]                                                                                       

In [20]: indices = xrange(2000)

In [21]: orig_df = pd.DataFrame(42.0, index=indices, columns=columns)

In [22]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
100 loops, best of 3: 12.6 ms per loop

In [23]: %timeit d = orig_df * 0.0
100 loops, best of 3: 7.17 ms per loop

这个速度提升跟数据表的大小有关,但我从来没有发现它会变慢。

而且,顺便提一下:

In [24]: %timeit d = orig_df * 0.0 + 1.0
100 loops, best of 3: 13.6 ms per loop

In [25]: %timeit d = pd.eval('orig_df * 0.0 + 1.0')
100 loops, best of 3: 8.36 ms per loop

但是:

In [24]: %timeit d = orig_df.copy()
10 loops, best of 3: 24 ms per loop

编辑!!!

假设你的数据表使用的是 float64 类型,这种方法会快得多!而且你可以通过把 0.0 替换成你想要的填充值来生成任何值。

In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0')
100 loops, best of 3: 3.68 ms per loop

根据个人喜好,你可以在外部定义缺失值(nan),然后做一个通用的解决方案,不管具体使用什么浮点类型:

In [39]: nan = np.nan
In [40]: %timeit d = pd.eval('orig_df > nan + 0.0')
100 loops, best of 3: 4.39 ms per loop
18

和@Shravan的做法类似,不过这里不使用numpy库:

  height = 10
  width = 20
  df_0 = pd.DataFrame(0, index=range(height), columns=range(width))

然后你可以随意对它进行操作:

post_instantiation_fcn = lambda x: str(x)
df_ready_for_whatever = df_0.applymap(post_instantiation_fcn)
21

如果你想让新的数据框(data frame)和一个已有的数据框有一样的索引和列,你可以直接把已有的数据框乘以零:

df_zeros = df * 0

如果已有的数据框里有空值(NaN)或者非数字的值,你可以对每个单元格应用一个函数,这个函数会返回0:

df_zeros = df.applymap(lambda x: 0)
50

我觉得用numpy来做这个是最好的选择。

import numpy as np
import pandas as pd
d = pd.DataFrame(np.zeros((N_rows, N_cols)))
212

创建一个用零填充的pandas数据框

feature_list = ["foo", "bar", 37]
df = pd.DataFrame(0, index=np.arange(7), columns=feature_list) 
print(df) 

这段代码会输出:

   foo  bar  37
0    0    0   0
1    0    0   0
2    0    0   0
3    0    0   0
4    0    0   0
5    0    0   0
6    0    0   0

撰写回答