Python 减少循环时间

Python 减少循环时间,python,pandas,dataframe,for-loop,Python,Pandas,Dataframe,For Loop,我正在一个有900万条记录的数据帧上进行数据转换,在整个数据帧上运行循环太长(~20-25分钟),下面是我的代码,有人能帮我提高for循环的速度吗,或者其他类似的方法。 例如: account_angaza_id cumulative_paid 0 AC002006 5000.0 1 AC002006 5000.0 2 AC002006 0.0 3

我正在一个有900万条记录的数据帧上进行数据转换,在整个数据帧上运行循环太长(~20-25分钟),下面是我的代码,有人能帮我提高for循环的速度吗,或者其他类似的方法。 例如:

 account_angaza_id  cumulative_paid
0           AC002006           5000.0
1           AC002006           5000.0
2           AC002006              0.0
3           AC002006              0.0
4           AC002006              0.0
5           AC002006              0.0
6           AC002006              0.0
7           AC002006              0.0
8           AC002006              0.0
9           AC002006              0.0
10          AC002007           5000.0
11          AC002007              0.0
12          AC002007              0.0
13          AC002007              0.0
14          AC002007              0.0
15          AC002007              0.0
16          AC002007              0.0
17          AC002007              0.0
18          AC002007              0.0


for i in df_merged.index:
    if (df_merged.at[i+1,'cumulative_paid'] == 0 and df_merged.at[i+1,'account_angaza_id'] == df_merged.at[i,'account_angaza_id']):
        df_merged.at[i+1,'cumulative_paid'] = df_merged.at[i,'cumulative_paid']
        if i+1 == len(df_merged)-1:
            break
结果

 account_angaza_id  cumulative_paid
0           AC002006           5000.0
1           AC002006           5000.0
2           AC002006           5000.0
3           AC002006           5000.0
4           AC002006           5000.0
5           AC002006           5000.0
6           AC002006           5000.0
7           AC002006           5000.0
8           AC002006           5000.0
9           AC002006           6000.0
10          AC002007           6000.0
11          AC002007           6000.0
12          AC002007           6000.0
13          AC002007           6000.0
14          AC002007           6000.0
15          AC002007           6000.0
16          AC002007           6000.0
17          AC002007           6000.0
18          AC002007           6000.0

任何输入都会很有帮助。

Pandas擅长向量化操作,因此通常可以避免Python级别的循环。在这种情况下,您可以使用
groupby
。首先将
0
值转换为
NaN
,然后使用+。这假设您的数据帧是按
帐户\u angaza\u id
排序的

col = 'cumulative_paid'

# replace 0 with NaN using a Boolean mask
df[col] = df[col].mask(df[col].eq(0))

# forward fill values by group, then replace any NaN values with 0
df[col] = df.groupby('account_angaza_id')[col].ffill().fillna(0)

print(df)

   account_angaza_id  cumulative_paid
0           AC002006           5000.0
1           AC002006           5000.0
2           AC002006           5000.0
3           AC002006           5000.0
4           AC002006           5000.0
5           AC002006           5000.0
6           AC002006           5000.0
7           AC002006           5000.0
8           AC002006           5000.0
9           AC002006           5000.0
10          AC002007           5000.0
11          AC002007           5000.0
12          AC002007           5000.0
13          AC002007           5000.0
14          AC002007           5000.0
15          AC002007           5000.0
16          AC002007           5000.0
17          AC002007           5000.0
18          AC002007           5000.0

开始熟悉。我复制了代码,但它不仅适用于下一行,也不适用于所有满足条件的行。有什么建议吗?@ArindamBose,不幸的是没有。我建议通过编辑你的问题来构建一个,否则复制你的问题并不是一件小事。嘿,我用一个例子编辑了这个问题,看看你现在是否能在这方面帮助我。@ArindamBose,出色的编辑,我已经相应地更新了我的答案。