按日期移动列匹配大熊猫

问题描述 投票:1回答:1

所以我有一个看起来像这样的Dataframe:

# 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
python pandas
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
© www.soinside.com 2019 - 2024. All rights reserved.