我正在对一个有 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
,然后使用 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
关于python - 减少for循环时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54291539/