所以我有一个数据帧,看起来像:
# 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