按日期匹配熊猫移动列



所以我有一个数据帧,看起来像:

# 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

您可以使用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

最新更新