Python 减少循环时间
我正在一个有900万条记录的数据帧上进行数据转换,在整个数据帧上运行循环太长(~20-25分钟),下面是我的代码,有人能帮我提高for循环的速度吗,或者其他类似的方法。 例如: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
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,出色的编辑,我已经相应地更新了我的答案。