Суммарная сумма прошедших месяцев с фреймом данных условия - PullRequest
0 голосов
/ 26 апреля 2020

Я только показываю 2 случая, которые иллюстрируют мою проблему, но реальный df имеет гораздо больше строк. Я хочу создать новый столбец, который будет считать месяцы, прошедшие с последнего рейза для каждого идентификатора. Если у id два рейза, месяц, прошедший с последнего рейза, должен снова сброситься во втором рейсе. Если у идентификатора был только один рейз, то разница месяца прошлого года с «последним рейзом» должна быть против самого старого месяца в df для каждого пользователя (первая строка для каждого пользователя).

Если у меня есть такой кадр данных:

id   amount         date.  diff_amount.  raise    
 1      200   01/02/2018           NaN       0                        
 1      200.  01/03/2018             0       0
 1      200   01/04/2018             0       0
 1      250.  01/05/2018            50       1
 1      250   01/06/2018             0       0
 1      250   01/07/2018             0       0
 1      250   01/09/2018             0       0
 1      250   01/11/2018             0       0
 1      350   01/12/2018           100       1
 1      250   01/01/2019             0       0
 2      500   01/06/2018           NaN       0
 2      500   01/07/2018             0       0
 2      500   01/06/2018             0       0
 2      550   01/07/2018            50       1

ожидаемый результат:

id   amount         date.  diff_amount.  raise     month_from_last_raise 
 1      200   01/02/2018           NaN       0                         0                        
 1      200.  01/03/2018             0       0                         1
 1      200   01/04/2018             0       0                         2
 1      250.  01/05/2018            50       1                         3
 1      250   01/06/2018             0       0                         1
 1      250   01/07/2018             0       0                         2
 1      250   01/09/2018             0       0                         3
 1      250   01/11/2018             0       0                         4
 1      350   01/12/2018           100       1                         5
 1      250   01/01/2019             0       0                         1
 2      500   01/06/2018           NaN       0                         0
 2      500   01/07/2018             0       0                         1
 2      500   01/06/2018             0       0                         2
 2      550   01/07/2018            50       1                         3

1 Ответ

0 голосов
/ 26 апреля 2020

Я не уверен, что полностью понимаю вопрос, но если я правильно понимаю, я нашел решение, отслеживая совокупные значения, затем группируя их по идентификаторам, а затем по совокупным значениям. Входной df должен называться "df", а выходной df будет называться "final_df":

# Make a column that cumulatively calculates the sums:
df['cumulative'] = df['raise'].cumsum()

# Group by id
id_group = df.groupby('id')

counter = 0
for each_group in id_group:
    # Group by the cumulative values
    cumulative_group = each_group[1].groupby('cumulative')

    for each_cumulative in cumulative_group:
        # Iterate through each cumulative values
        temp_df = each_cumulative[1]
        # Count the number of months since the last change:
        temp_df['month_from_last_raise'] = list(range(temp_df.shape[0]))
        if counter == 0:
            final_df = temp_df
            counter += 1
        else:
            final_df = final_df.append(temp_df)

final_df.drop('cumulative', axis=1, inplace=True)
...