Сдвиг столбцов по дате совпадения панд - PullRequest
0 голосов
/ 04 мая 2018

Итак, у меня есть датафрейм, который выглядит так:

# Identifier  DATE       RDATE      X Y Z
#  1         1990-08-29 1990-04-30  1 2 3
#  1         1990-09-29 1990-04-30  1 2 3
#  1         1990-10-29 1990-07-30  3 5 7
#  2         1990-11-29 1990-07-30  2 1 4
#  2         1990-12-29 1990-10-30  2 1 5
#  3         1990-05-29 1990-01-30  1 2 3
#  3         1990-06-29 1990-04-30  4 4 4
#  3         1990-07-29 1990-04-30  4 4 4
#  3         1990-08-29 1990-06-30  1 1 1

По сути, я хотел бы сдвинуть столбцы RDATE, X, Y, Z кадра данных таким образом, чтобы столбец RDATE всегда был ближайшей датой, предшествующей дате в столбце DATE, с учетом идентификатора. Обратите внимание, что некоторые даты в DATE встречаются несколько раз для разных идентификаторов.

Я предполагаю, что решение потребует от меня группировки идентификатора, что я могу сделать. Моя проблема заключается в сравнении столбца DATE с RDATE, а затем смещении других столбцов в зависимости от местоположения.

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

# Identifier  DATE       RDATE      X Y Z
#  1         1990-08-29 1990-07-30  3 5 7
#  1         1990-09-29 1990-07-30  3 5 7
#  1         1990-10-29 1990-07-30  3 5 7
#  2         1990-11-29 1990-10-30  2 1 5
#  2         1990-12-29 1990-10-30  2 1 5
#  3         1990-05-29 1990-04-30  4 4 4
#  3         1990-06-29 1990-04-30  4 4 4
#  3         1990-07-29 1990-06-30  1 1 1
#  3         1990-08-29 1990-06-30  1 1 1

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете использовать merge_asof :

df['DATE'] = pd.to_datetime(df['DATE'])
df['RDATE'] = pd.to_datetime(df['RDATE'])

result = pd.merge_asof(df[['Identifier', 'DATE']].sort_values('DATE'), df[['Identifier', 'RDATE', 'X', 'Y', 'Z']].sort_values('RDATE'), left_on='DATE', right_on='RDATE', by='Identifier').sort_values(['Identifier','DATE']).reset_index(drop=True)
result
#   Identifier       DATE      RDATE  X  Y  Z
#0           1 1990-08-29 1990-07-30  3  5  7
#1           1 1990-09-29 1990-07-30  3  5  7
#2           1 1990-10-29 1990-07-30  3  5  7
#3           2 1990-11-29 1990-10-30  2  1  5
#4           2 1990-12-29 1990-10-30  2  1  5
#5           3 1990-05-29 1990-04-30  4  4  4
#6           3 1990-06-29 1990-04-30  4  4  4
#7           3 1990-07-29 1990-06-30  1  1  1
#8           3 1990-08-29 1990-06-30  1  1  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...