簡體   English   中英

如何在大熊貓數據框中加快迭代功能?

[英]How can I speed up an iterative function on my large pandas dataframe?

我對熊貓還很陌生,我有一個大約有500,000行的熊貓數據框,上面有數字。 我正在使用python 2.x,目前正在定義和調用下面顯示的方法。 如果系列“ A”中的兩個相鄰值相同,則它將預測值設置為等於系列“ B”中的對應值。 但是,它運行非常慢,每秒大約輸出5行,我想找到一種更快地完成相同結果的方法。

def myModel(df):

    A_series = df['A']
    B_series = df['B']
    seriesLength = A_series.size

    # Make a new empty column in the dataframe to hold the predicted values
    df['predicted_series'] = np.nan

    # Make a new empty column to store whether or not
    # prediction matches predicted matches B
    df['wrong_prediction'] = np.nan
    prev_B = B_series[0]
    for x in range(1, seriesLength):

        prev_A = A_series[x-1]  
        prev_B = B_series[x-1]
        #set the predicted value to equal B if A has two equal values in a row
        if A_series[x] == prev_A:
            if df['predicted_series'][x] > 0:
                 df['predicted_series'][x] = df[predicted_series'][x-1]
            else:
                 df['predicted_series'][x] = B_series[x-1]

有沒有一種方法可以對此進行矢量化或使其運行更快? 在當前情況下,預計將花費許多小時。 真的需要這么長時間嗎? 看來500,000行應該不會給我的程序帶來太大問題。

像您描述的那樣,這樣的事情應該起作用:

df['predicted_series'] = np.where(A_series.shift() == A_series, B_series, df['predicted_series'])
df.loc[df.A.diff() == 0, 'predicted_series'] = df.B  

這將擺脫for循環,並在A等於先前的A時將Forecast_series設置為B的值。

編輯:

根據您的評論,將您的Forecast_series初始化更改為全部NAN,然后預先填充以下值:

df['predicted_series'] = np.nan
df.loc[df.A.diff() == 0, 'predicted_series'] = df.B
df.predicted_series = df.predicted_series.fillna(method='ffill')

對於最快的修改ayhans速度,回答會更好:

df['predicted_series'] = np.where(df.A.shift() == df.A, df.B, df['predicted_series'].shift())

這將為您提供向前填充的值,並且比我最初的建議運行得更快

df.loc[df.A == df.A.shift()] = df.B.shift()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM