Apa cara terbaik untuk membuat bingkai data panda berisi nol dengan ukuran tertentu?
Saya telah menggunakan:
zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)
Apakah ada cara yang lebih baik untuk melakukannya?
data
? Mengapa Anda perlu membuat struktur lain untuk menahannya?Jawaban:
Anda dapat mencoba ini:
d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)
sumber
%timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])
membutuhkan 156 kami. Tapi%timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])
membawa 171 kita. Saya terkejut itu tidak lebih cepat.d.set_value(params)
setelah menginisialisasid
berisi 0. Mudah memperbaiki adalah:d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list)
.Paling baik melakukan ini dengan numpy menurut saya
import numpy as np import pandas as pd d = pd.DataFrame(np.zeros((N_rows, N_cols)))
sumber
TypeError: 'numpy.float64' object does not support item assignment
np.float64
Mirip dengan @Shravan, tetapi tanpa penggunaan numpy:
height = 10 width = 20 df_0 = pd.DataFrame(0, index=range(height), columns=range(width))
Kemudian Anda dapat melakukan apa pun yang Anda inginkan dengannya:
post_instantiation_fcn = lambda x: str(x) df_ready_for_whatever = df_0.applymap(post_instantiation_fcn)
sumber
Jika Anda ingin bingkai data baru memiliki indeks dan kolom yang sama dengan bingkai data yang sudah ada, Anda bisa mengalikan bingkai data yang ada dengan nol:
df_zeros = df * 0
sumber
Jika Anda sudah memiliki dataframe, inilah cara tercepat:
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
Dibandingkan dengan:
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
sumber
Dengan asumsi memiliki template DataFrame, mana yang ingin disalin dengan nilai nol diisi di sini ...
Jika Anda tidak memiliki NaN dalam kumpulan data Anda, mengalikan dengan nol bisa jauh lebih cepat:
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
Peningkatan bergantung pada ukuran DataFrame, tetapi tidak pernah menemukannya lebih lambat.
Dan hanya untuk itu:
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
Tapi:
In [24]: %timeit d = orig_df.copy() 10 loops, best of 3: 24 ms per loop
EDIT !!!
Dengan asumsi Anda memiliki bingkai yang menggunakan float64, ini akan menjadi yang tercepat dengan margin yang sangat besar! Itu juga dapat menghasilkan nilai apa pun dengan mengganti 0,0 ke nomor isian yang diinginkan.
In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0') 100 loops, best of 3: 3.68 ms per loop
Tergantung pada selera, seseorang dapat mendefinisikan nan secara eksternal, dan melakukan solusi umum, terlepas dari jenis float tertentu:
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
sumber