我正在对具有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
任何输入都会有所帮助。
答案 0 :(得分:1)
Pandas专门从事矢量化操作,因此通常可以避免Python级循环。在这种情况下,您可以使用groupby
。首先将0
的值转换为NaN
,然后使用groupby
+ ffill
。假设您的数据框按account_angaza_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