Сдвигать даты на лету в зависимости от условия с использованием pandas - PullRequest
4 голосов
/ 18 июня 2020

У меня есть фрейм данных, как показано ниже

df1 = pd.DataFrame({'person_id': [11, 21, 31, 41, 51],
                        'date_1': ['12/30/1961', '05/29/1967', '02/03/1957', '7/27/1959', '01/13/1971'],
                        'backward': [0,120,1,2,3],
                        'forward':  [0,12,1,0,0]})
df1['date_1'] = pd.to_datetime(df1['date_1'])

Я бы хотел сделать

1) Сдвиг вперед date_1 столбец на основе значений из столбца forward (добавить даты).

2) если столбец forward имеет значение 0, выберите значение из backward и сместите дату backward (вычесть даты)

3) если оба forward и backward равны 0, это не повлияет на даты, как мы add/subtract 0 days to date. В целях кодирования, если вы все еще хотите знать, какой столбец выбрать, мы можем рассмотреть столбец backward.

Это то, что я пробовал

df1['new_date'] = df1['date_1'].sub(pd.to_timedelta(df1['forward'],unit='d'))
df1['bool'] = df1['date_1'].eq(df1['new_date']) # i do this to find out which rows aren't changed. So I can look at backward column to subtract days for these records
df1.loc[df1.bool == True, "new_date"] = df1['date_1'].sub(pd.to_timedelta(df1['backward'],unit='d'))

Я ожидаю, что мой результат будет похож на как показано ниже. Как вы можете видеть для последних 2 строк и 1-й строки, столбец forward имел значение 0, поэтому мы выбираем значения из столбца backward и subtract the dates

enter image description here

1 Ответ

4 голосов
/ 18 июня 2020

вы можете использовать mask вперед, чтобы заменить 0 на минус столбец в обратном направлении, а затем добавить to_timedelta этот ряд к дате

df1['new_date'] = (df1['date_1'] 
                   + pd.to_timedelta(df1['forward'].mask(lambda x: x.eq(0), 
                                                         -df1['backward']), 
                                     unit='d')
                  )
print (df1)
   person_id     date_1  backward  forward   new_date
0         11 1961-12-30         0        0 1961-12-30
1         21 1967-05-29       120       12 1967-06-10
2         31 1957-02-03         1        1 1957-02-04
3         41 1959-07-27         2        0 1959-07-25
4         51 1971-01-13         3        0 1971-01-10
...