创建一个零填充的pandas数据框
创建一个指定大小的全零 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