如何加快大Pandas数据帧上的迭代函数?

2024-09-24 02:18:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我对pandas很陌生,我有一个大约500000行的pandas数据框,里面充满了数字。我使用的是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行不应该给我的程序带来那么多问题。在


Tags: theto方法inpandasdfnewmake
3条回答
df.loc[df.A.diff() == 0, 'predicted_series'] = df.B  

这将消除for循环,并在A等于前一个A时将预测的_系列设置为B的值

编辑:

根据您的注释,将predicted_series的初始化更改为全部NAN,然后前填充值:

^{pr2}$

对于最快的修改速度,艾汉斯的答案是最好的:

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

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

类似这样的方法应该可以像您所描述的那样工作:

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

解决方案

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

相关问题 更多 >