2014-03-04 135 views
2

我有一個名爲df的熊貓數據框。當我做到以下幾點:爲什麼dataframe.values很慢

A = df.values 後來,當我檢查: A是df.values 返回FALSE。

即使當我檢查type(A)type(df.values),都重新運行該類型numpy.ndarray

字符串和數值數據的同時,我也DF混合數據。呼叫A[10,1]明顯比呼叫要快df.values[10,1

我想知道當我打電話給df.values時發生了什麼?

由於

回答

3

對於混合類型的主叫.values的DataFrames多個塊(每個D型)轉換成包羅萬象的D型細胞之一numpy的陣列。對於大型幀,此轉換速度可能較慢。

In [11]: pd.DataFrame([[1, 2.]]).values 
Out[11]: array([[ 1., 2.]]) 

In [12]: pd.DataFrame([[1, 2., 'a']]).values 
Out[12]: array([[1, 2.0, 'a']], dtype=object) 

與定時的例子:

In [21]: df = pd.DataFrame(np.random.randn(10000)) 

In [22]: %timeit df.values # no conversion 
100000 loops, best of 3: 3.72 µs per loop 

In [23]: df[1] = 'a' # add column of object dtype 

In [24]: %timeit df.values # conversion to object dtype 
1000 loops, best of 3: 681 µs per loop 

您可以看到數據經由._data屬性存儲在圖塊管理員。

爲了回答這個問題,因爲該屬性的值是計算每個返回numpy的陣列具有不同的ID /存儲器地址等A is df.values爲False時間。您需要使用類似numpy的array_equal:

In [31]: df.values is df.values 
Out[31]: False 

In [32]: np.array_equal(df.values, df.values) 
Out[32]: True 
+0

感謝您的解釋。現在我明白了.value調用的底層工作原理。 – user3377229