2016-09-16 54 views
0

我有一個大熊貓數據框。它有數千列和超過一百萬行。我想要計算最大值和最小值之間的差異。請記住,有許多NaN值和一些行都是NaN值(但我仍想保留它們!)。如何優化在Python中的大數據框上迭代的代碼

我寫了下面的代碼。它的工作,但它很費時間:

totTime = [] 
for index, row in date.iterrows(): 
    myRow = row.dropna() 
    if len(myRow): 
     tt = max(myRow) - min(myRow) 
    else: 
     tt = None 
    totTime.append(tt) 

有沒有什麼辦法來優化它?我試着用下面的代碼,但我得到一個錯誤,當它遇到所有NaN行:

tt = lambda x: max(x.dropna()) - min(x.dropna()) 
totTime = date.apply(tt, axis=1) 

任何建議將不勝感激!

+3

IIUC你可以做'date.max(軸= 1) - data.min(軸= 1) ' – EdChum

+3

你應該避免使用循環和'apply'並且像我建議的那樣搜索矢量化方法,大多數熊貓操作將優雅地處理'NaN',然後需要在操作之前或之後過濾掉 – EdChum

回答

2

它通常是一個壞主意,使用pythonfor循環遍歷大pandas.DataFramenumpy.ndarray。您應該使用可用的構建函數,因爲它們已經過優化,並且在很多情況下實際上不是用python編寫的,而是以編譯語言編寫的。在你的情況下,你應該使用方法pandas.DataFrame.maxpandas.DataFrame.min,這兩個方法都會給你一個選項skipna跳過你的DataFrame中的nan值,而不需要手動實際丟棄它們。此外,您可以選擇axis以最小化。因此,您可以指定axis=1以獲得沿列的最小值。

這加起來的什麼@EdChum在評論剛纔提到類似的事情:

data.max(axis=1, skipna=True) - data.min(axis=1, skipna=True) 
+2

'skipna'默認爲'True',所以不需要:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html – EdChum

+0

哦,很高興知道,謝謝。我通常更喜歡顯式的隱含,並會保留它。 – jotasi

0

我有關於迭代的相同問題。 2分:

  1. 爲什麼不用0代替NaN值?你可以用這個df.replace(['inf','nan'],[0,0])做到這一點。它取代了inf和nan值。
  2. 看看這個This。也許你可以理解,我有一個類似的問題,關於如何優化循環來計算實際行與前一行之間的差異。
+0

Hi Juliana。我不用0代替NaN值,因爲在我的情況下NaN意味着缺失,0是可能的測量。如果我用0代替NaN,我的數據將不再代表我的情況。我也同意你分享的帖子。關鍵是避免循環。 –