ゼロで満たされたパンダデータフレームの作成


103

特定のサイズのゼロで満たされたパンダデータフレームを作成する最良の方法は何ですか?

利用した:

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

それを行うより良い方法はありますか?


1
いいえ、大幅な改善は考えられません。
Dan Allan 14

データが大きなセットであるため、np.zerosでメモリエラーが発生します。私にできることのヒントはありますか?「MemoryError」以外の出力はありませんでした。私は100GBのRAMを搭載しており、データはわずか20GBですが、それでも失敗します。デバッグ方法がわからない、64ビットUbuntuサーバー。私は少しググりましたが、みんなが言う-チャンクに分割しますが、このデータは分割できません。
niedakh 2014

あなただけで作業できますdataか?それを保持するために別の構造を作成する必要があるのはなぜですか?
Phillip Cloud

回答:


137

あなたはこれを試すことができます:

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

2
私が見つけたこれをテストするに%timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])は、156時間がかかります。しかし%timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])、171時間がかかります。それがこれ以上速くないことに驚いています。
emschorsch 2015

3
0を含むようd.set_value(params)に初期化dした後などに、int / floatの問題が発生する可能性があることに注意してください。簡単な修正は次のとおりd = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list)です。
ximiki 2017

29

私の意見ではこれを派手に行うのが最善です

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

1
このようにすると、「0」の値を変更できませんでした。TypeError: 'numpy.float64' object does not support item assignment
RightmireM 2018年

@RightmireMそれらをどのように正確に変更しようとしていますか?あなたは正しい、データ型はnp.float64
AlexG

11

@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)

8

新しいデータフレームのインデックスと列を既存のデータフレームと同じにする場合は、既存のデータフレームにゼロを乗算するだけです。

df_zeros = df * 0

2
dfにNaNが含まれている場合は常に、ゼロではなくNaNを取得することに注意してください。
kadee

1

すでにデータフレームがある場合は、これが最も速い方法です。

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

1

ここにゼロの値を入力してコピーしたいテンプレートDataFrameがあると仮定します...

データセットにNaNがない場合は、ゼロを乗算すると大幅に速くなります。

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

1
これは間違いなくタイミングに関する最も包括的な答えですが、OPの場合、メモリ要件が問題であり、速度ではないようです... )、おそらくいくつかの変更があったでしょう。
Moot 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.