2017-03-06 3 views
2

パンダのデータフレームのすべての列を単一の型にキャストする方法はありますか?これは、特に遅いようだ:すべてのデータフレーム列をフロートにキャストする最速の方法 - パンダastype slow

df = df.apply(lambda x: x.astype(np.float64), axis=1) 

私はずっと私が原因numpy.ndarray.astypeのメモリ割り当てのオーバーヘッドのそれについて行うことができないがあります疑い。

私もpd.to_numericを試しましたが、代わりにいくつかの列をintタイプにキャストすることを任意に選択しました。

答えて

4

applyの必要はありません。ちょうどDataFrame.astypeを使用してください。

df.astype(np.float64) 

apply -ingもかなりパフォーマンスが低下します。

df = pd.DataFrame(np.arange(10**7).reshape(10**4, 10**3)) 

%timeit df.astype(np.float64) 
1 loop, best of 3: 288 ms per loop 

%timeit df.apply(lambda x: x.astype(np.float64), axis=0) 
1 loop, best of 3: 748 ms per loop 

%timeit df.apply(lambda x: x.astype(np.float64), axis=1) 
1 loop, best of 3: 2.95 s per loop
1

一つ効率的な方法は、配列データを扱うので、同様に、バックデータフレームにキャストすることであろう -

pd.DataFrame(df.values.astype(np.float64)) 

ランタイム試験 -

In [144]: df = pd.DataFrame(np.random.randint(11,99,(5000,5000))) 

In [145]: %timeit df.astype(np.float64) # @Mitch's soln 
10 loops, best of 3: 121 ms per loop 

In [146]: %timeit pd.DataFrame(df.values.astype(np.float64)) 
10 loops, best of 3: 42.5 ms per loop 

データフレームへのキャスティングはコストがかかりませんでした -

In [147]: %timeit df.values.astype(np.float64) 
10 loops, best of 3: 42.3 ms per loop # Casting to dataframe costed 0.2ms 
関連する問題