Уменьшение времени цикла - PullRequest
0 голосов
/ 21 января 2019

Я выполняю преобразование данных на фрейме данных с 9 миллионами записей, слишком много времени занимает (~ 20-25 минут) цикл на всем фрейме данных, ниже приведен мой код, может кто-нибудь помочь мне с увеличением скорость цикла или любой другой альтернативы. Например:

 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 голосов
/ 21 января 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...