创建一个零填充的熊猫数据框架

创建给定大小的零填充熊猫数据帧的最佳方法是什么?

我用过:

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

还有更好的办法吗?

271354 次浏览

你可以试试这个:

d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)

如果你已经有一个数据框架,这是最快的方法:

In [1]: columns = ["col{}".format(i) for i in range(10)]
In [2]: orig_df = pd.DataFrame(np.ones((10, 10)), columns=columns)
In [3]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
10000 loops, best of 3: 60.2 µs per loop

相比之下:

In [4]: %timeit d = pd.DataFrame(0, index = np.arange(10), columns=columns)
10000 loops, best of 3: 110 µs per loop


In [5]: temp = np.zeros((10, 10))
In [6]: %timeit d = pd.DataFrame(temp, columns=columns)
10000 loops, best of 3: 95.7 µs per loop

假设有一个模板 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

改进依赖于 DataFrame 的大小,但从未发现它更慢。

只是为了好玩:

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

在我看来,最好是麻木地做这件事

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

类似于@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)

如果您希望新的数据框架具有与现有数据框架相同的索引和列,只需将现有数据框架乘以零即可:

df_zeros = df * 0

如果现有的数据框架包含 NaN 或非数字值,那么可以对每个单元格应用一个函数,该函数只返回0:

df_zeros = df.applymap(lambda x: 0)