2017-07-19 58 views
3

我有一個大約100行的熊貓DataFrame,從中我需要從一列中爲某個給定的索引以高效的方式選擇值。目前我使用df.loc[index, 'col']這一點,但是這似乎是相對緩慢:熊貓的速度df.loc [x,'column']

df = pd.DataFrame({'col': range(100)}, index=range(100))  
%timeit df.loc[random.randint(0, 99), 'col'] 
#100000 loops, best of 3: 19.3 µs per loop 

什麼似乎要快得多(由約10倍的因子)是把數據幀轉換成字典,然後查詢:

d = df.to_dict()  
%timeit d['col'][random.randint(0, 99)] 
#100000 loops, best of 3: 2.5 µs per loop 

有沒有辦法使用正常的數據框方法獲得類似的性能,而不顯式創建字典?我應該使用.loc以外的東西嗎?

或者這只是一種情況,我最好使用這種解決方法?

+2

這裏有幾個選擇:'df.get_value(隨機.randint(0,99),'col')'(最快),'df ['col']。values [random.randint(0,99)]'(假定位置和標籤是相同的)和'df。在[random.randint(0,99),'col']'但這部分我在執行代碼優化時,通常不是您應該關注的部分。大概你是在一個循環裏面做的,對吧? – ayhan

+4

同意@ayhan,由於Pandas方法大量超載,並且每個都包含多個字典訪問,所以純Python字典幾乎肯定會比Pandas方法更快地按索引讀取標量值。性能改進的最大潛力在於使用矢量化函數而不是Python循環。 –

+0

不幸的是,vectorisation在這裏並不是一個真正的選項,因爲我需要逐行處理文件,並且不能將所有數據保存在內存中。在我的情況下,從'.loc'切換到'dict'好像導致了整個循環的5-10倍的加速。 – Nils

回答

0

一個dict確實似乎是最快的選項:

df_dict = df.to_dict() 
df_numpy = np.array(df) 
print(timeit.timeit("df.loc[random.randint(0, 99), 'col']", number = 100000, globals=globals())) 
print(timeit.timeit("df.get_value(random.randint(0, 99), 'col')", number = 100000, globals=globals())) 
print(timeit.timeit('df_numpy[df_numpy[random.randint(0, 99)]]', number=100000, globals=globals())) 
print(timeit.timeit("df_dict['col'][random.randint(0, 99)]", number = 100000, globals=globals())) 

結果:

4.859706375747919 
1.8850274719297886 
1.4855970665812492 
0.6550335008651018 
0

如果高效是一個需要考慮的因素,Numpy數組可能是比熊貓數據框更好的選擇。我嘗試重現你的例子爲度量的效率比較:

import numpy as np 
import pandas as pd 
import timeit, random 

df = pd.DataFrame({'col': range(100)}, index=range(100)) 
print(timeit.timeit('df.loc[random.randint(0, 99), "col"]', number=10000, globals=globals())) 

ds_numpy = np.array(df) 
print(timeit.timeit('ds_numpy[ds_numpy[random.randint(0, 99)]]', number=10000, globals=globals())) 

結果:

$ python test_pandas_vs_numpy.py 
0.1583892970229499 
0.05918855100753717 

在這種情況下,它看起來像比使用numpy的陣列上大熊貓據幀是在性能方面的優勢。

參考:1

+0

謝謝 - 雖然這是對.loc的改進,但它似乎比使用字典(約2-3x)慢得多。 – Nils