如何在我的大熊猫数据帧上加速迭代功能?

时间:2016-05-13 16:43:59

标签: python performance 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行不应该给我的程序带来太多问题。

3 个答案:

答案 0 :(得分:1)

这样的事情应该像你描述的那样起作用:

df['predicted_series'] = np.where(A_series.shift() == A_series, B_series, df['predicted_series'])

答案 1 :(得分:1)

df.loc[df.A.diff() == 0, 'predicted_series'] = df.B  

当A等于之前的A时,这将摆脱for循环并将predict_series设置为B的值。

修改

根据您的评论,将predict_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())

这将为您提供前向填充值,并且比我原来的建议运行得更快

答案 2 :(得分:0)

解决方案

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