我正在嘗試調試一個慢速腳本,並且讓我自己對大熊貓中不同操作的時間非常困惑。也許這裏有很棒的文檔,但我還沒有找到它們。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的〜的測量誤差,所以這是在水平我關心的。
是的是的偉大工程,迫使副本給人以巨大的速度向上。 – TristanMatthews