2015-06-30 19 views
1

我正在嘗試調試一個慢速腳本,並且讓我自己對大熊貓中不同操作的時間非常困惑。也許這裏有很棒的文檔,但我還沒有找到它們。Pandas過濾,重命名和添加列的時間

我的測試腳本是:

import pandas as pd 
import numpy as np 
import datetime 

# Set up simple timing. 
times = [] 
labels = [] 
times.append(datetime.datetime.now()) 

# Build a dataframe. 
df = pd.DataFrame(np.random.rand(20000,2), columns=['x', 'y']) 
labels.append('Build DataFrame') 
times.append(datetime.datetime.now()) 

# Filter the dataframe. 
df = df[df.x > .5] 
labels.append('Filter') 
times.append(datetime.datetime.now()) 

# Rename some stuff. 
df.rename(
    columns={ 
     'x': 'X', 
     'y': 'Y', 
    }, inplace=True, copy=False 
) 
labels.append('Rename columns') 
times.append(datetime.datetime.now()) 

# Add a column. 
df['n'] = 1 
labels.append('Add column') 
times.append(datetime.datetime.now()) 

print(df) 

# Print out times in seconds. 
print([labels[i] + ': ' + str((times[i + 1] - times[i]).total_seconds() * 1000.0) 
     for i in range(len(times) - 1)]) 
print('Total: ' + str((times[-1] - times[0]).total_seconds() * 1000.0)) 

這給了我的時間:

['Build DataFrame: 1.19', 'Filter: 1.285', 
'Rename columns: 16.884', 'Add column: 0.724'] 

Total: 20.083 

如果我理解正確的重命名,我不應該被複制任何東西剛更新的名稱,以便應該差不多談沒時間。如果我重新安排要獲得的東西,這就誕生了。

['Build DataFrame: 1.613', 'Rename columns: 0.702', 
'Filter: 2.664', 'Add column: 18.002'] 

Total: 22.981 

然後Tt顯示添加列一直在進行。再次重新安排,我已經讓所有事情都變得超級快捷?

['Build DataFrame: 1.05', 'Rename columns: 0.364', 
'Add column: 0.921', 'Filter: 1.52'] 

Total: 3.855 

如果我使用DF [ 'M'] = np.random.rand添加另一列,此時(df.shape [0]),使得每個元件具有其自身的價值,我結束了。

['Build DataFrame: 1.015', 'Rename columns: 0.324', 
'Add column: 0.473', 'Filter: 1.247', 'Add column: 18.497'] 

Total: 21.556 

我可以通過在過濾器之前推動列添加來再次加快速度。

['Build DataFrame: 1.022', 'Rename columns: 0.439', 
'Add column: 0.51', 'Add column: 0.58', 'Filter: 4.192'] 

Total: 6.743 

顯然,過濾和複製是這裏唯一昂貴的操作,不管我做什麼他們爲了我得到一個一致的print(df)輸出。

我對這裏發生的事情的猜測是過濾器簡單地存儲了一個掩碼,但實際上並沒有強制拷貝直到它必須。通過添加一列我強制該副本。我不明白爲什麼重命名會強制該副本。

有沒有辦法手動強制該副本進行測試?

更新爲完整性。 使用nitis`DF =(DF [df.X> 0.5])。拷貝()

['Build DataFrame: 0.989', 'Filter: 1.578', 'Rename columns: 0.362', 
'Add column: 0.441'] 
Total: 3.37 

順便說一句我的 '高度科學' 定時系統具有1ms的〜的測量誤差,所以這是在水平我關心的。

回答

1

嘗試更換

df = df[df.X > .5] 

用,

df = (df[df.X > .5]).copy() 
+0

是的是的偉大工程,迫使副本給人以巨大的速度向上。 – TristanMatthews

相關問題