Python 如何在大熊猫数据帧上加速迭代函数?

Python 如何在大熊猫数据帧上加速迭代函数?,python,performance,pandas,dataframe,Python,Performance,Pandas,Dataframe,我对熊猫很陌生,我有一个大约500000行的熊猫数据框,里面充满了数字。我正在使用Python2.x,目前正在定义和调用下面所示的方法。如果序列“a”中的两个相邻值相同,则将预测值设置为等于序列“B”中的相应值。但是,它的运行速度非常慢,大约每秒输出5行,我想找到一种更快地实现相同结果的方法 def myModel(df): A_series = df['A'] B_series = df['B'] seriesLength = A_series.size #

我对熊猫很陌生,我有一个大约500000行的熊猫数据框,里面充满了数字。我正在使用Python2.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]

有没有办法将其矢量化,或者只是让它运行得更快?在目前情况下,预计需要很多小时。真的要花这么长时间吗?看起来500000行不应该给我的程序带来那么多问题。

类似的内容应该如您所述:

df['predicted_series'] = np.where(A_series.shift() == A_series, B_series, df['predicted_series'])
这将摆脱for循环,并在A等于前一个A时将predicted_series设置为B值

编辑:

根据您的评论,将预测的_系列的初始化更改为全部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')
要获得最快的速度,请选择一个bit:

df['predicted_series'] = np.where(df.A.shift() == df.A, df.B, df['predicted_series'].shift())
这将为您提供正向填充值,并比我最初的建议解决方案运行得更快


您正在使用Python3.x吗?如果没有,请尝试至少从
range
切换到
xrange
。我使用的是Python2.x。我将编辑我的问题,将其包括在内。这是文本还是数字数据?都是数字数据。非常感谢!然而,预测序列所取的值是否也有条件?因为在某些条件下,我希望预测值等于先前的预测值,并且只有在先前的预测值为nan时才使用“B”,因为有许多缺失值。因此,请告诉我我是否正确。当A和上一个A相等时,您希望预测的_系列的值等于df.B,否则您希望预测的_系列的值等于上一个预测的_系列值?不完全是这样,预测的_系列仅设置为A和上一个A相等时的值。如果先前预测的_序列为NaN,则预测的_序列等于df.B。否则,如果先前预测的_序列是某个大于0的数字,则预测的_序列=先前预测的_序列。@Richard我认为ayhan的方法实际上更快。谢谢,我正在测试它。它还在运行。不过,为了更深入地理解,您是否介意解释一下如何推断哪种方法更快?谢谢。你知道有没有一种方法可以将一个条件添加到U系列的预测值中?还有,这个运行得快吗?比循环快得多吗?很可能。比Grr的答案快得多?我不确定。对于100个随机行,它比.loc快3倍,但您应该在更大的数据帧上尝试。您还可以为预测的序列提供条件。具体情况如何?谢谢。两种我都试试。条件是预测的_序列仅在a和前一个a相等时设置为一个值。如果先前预测的_序列为NaN,则预测的_序列等于df.B。否则,如果先前预测的_序列是某个大于0的数字,那么预测的_序列=先前预测的_序列我们说的是动态赋值,对吗?当A[n]等于A[n-1]时,它被B[n]填充,这没关系。如果A[n+1]==A[n],由于pred[n]不是nan,您想要的是pred[n+1]=pred[n],而不是B[n],对吗?对不起,我不知道不使用循环的任何解决方案。似乎没有限制可以相同的后续A[n]s的数量(即,一行中的10个也可以相同),因此您不能仅使用一个班次进行检查。如果你问了一个新的问题,并且有额外的限制,你可能会有更好的机会得到答案。
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()