創建給定大小零填充熊貓數據幀的最佳方式是什麼?創建零填充熊貓數據幀
我用:
zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)
有沒有更好的辦法做到這一點?
創建給定大小零填充熊貓數據幀的最佳方式是什麼?創建零填充熊貓數據幀
我用:
zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)
有沒有更好的辦法做到這一點?
你可以試試這個:
d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)
測試這個我發現'%timeit temp = np.zeros((10,11)); d = pd.DataFrame(temp,columns = ['col1','col2',...'col11'])'需要156 us。 但是'%timeit d = pd.DataFrame(0,index = np.arange(10),columns = ['col1','col2',...'col11'])'需要171 us。我很驚訝它沒有更快。 – emschorsch
請注意,如果在將'd'初始化爲包含0之後您將執行類似'd.set_value(params)'的操作,則可能會遇到int/float問題。一個簡單的解決方法是:'d = pd.DataFrame(0.0,index = np.arange(len(data)),columns = feature_list)'。 – ximiki
如果你已經有一個數據幀,這是最快的方法:
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,想要複製零值的數據幀...
如果你沒有在的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
提高取決於數據幀的大小,但從來沒有發現它比較慢。
而只是它的挫折感:
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
根據口味,可以在外部定義楠,做一個通用的解決方案,而不管具體的float類型的:
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
這絕對是最全面的答案,儘管對於OP來說,內存要求似乎是問題,而不是速度......順便說一下,在我的系統中,您寫的前兩個建議給出了相同的時間(Pandas 0.20。 3),所以也許有一些變化。 – Moot
這是最好的在我看來,與numpy的做到這一點
import numpy as np
d = pd.DataFrame(np.zeros((N_rows, N_cols)))
當我這樣做時,我無法改變「0」值。 '''TypeError:'numpy.float64'對象不支持項目分配 ''' – RightmireM
@RightmireM你究竟如何改變它們?你是對的,數據類型是'np.float64' – AlexG
到@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)
不,我不認爲對任何實質性的改善。 –
我在np.zeros上遇到內存錯誤,因爲數據很大。我能做什麼的提示?除了「MemoryError」之外,我沒有其他輸出。我有100GB的RAM,數據只有20GB,但仍然失敗。不知道如何調試它,64位Ubuntu的服務器。我搜索了一下,但每個人都說 - 分成塊,但這些數據不能分開。 – niedakh
你能用'data'工作嗎?爲什麼你需要創建另一個結構來保存它? –