我有一個大約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
以外的東西嗎?
或者這只是一種情況,我最好使用這種解決方法?
這裏有幾個選擇:'df.get_value(隨機.randint(0,99),'col')'(最快),'df ['col']。values [random.randint(0,99)]'(假定位置和標籤是相同的)和'df。在[random.randint(0,99),'col']'但這部分我在執行代碼優化時,通常不是您應該關注的部分。大概你是在一個循環裏面做的,對吧? – ayhan
同意@ayhan,由於Pandas方法大量超載,並且每個都包含多個字典訪問,所以純Python字典幾乎肯定會比Pandas方法更快地按索引讀取標量值。性能改進的最大潛力在於使用矢量化函數而不是Python循環。 –
不幸的是,vectorisation在這裏並不是一個真正的選項,因爲我需要逐行處理文件,並且不能將所有數據保存在內存中。在我的情況下,從'.loc'切換到'dict'好像導致了整個循環的5-10倍的加速。 – Nils