减少循环时间

时间:2019-01-21 13:58:57

标签: 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           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

任何输入都会有所帮助。

1 个答案:

答案 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