Jadi saya memiliki Dataframe yang terlihat seperti:

# 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

Pada dasarnya yang ingin saya lakukan adalah menggeser kolom RDATE, X, Y, Z dari kerangka data sedemikian rupa sehingga kolom RDATE selalu merupakan tanggal terdekat yang terjadi sebelum tanggal di kolom DATE dengan tetap menghormati pengidentifikasi. Perhatikan bahwa beberapa tanggal dalam DATE muncul beberapa kali untuk pengidentifikasi yang berbeda.

Saya berasumsi solusinya akan mengharuskan saya untuk mengelompokkan berdasarkan pengidentifikasi, yang dapat saya lakukan. Masalah saya terletak pada membandingkan kolom DATE dengan RDATE dan kemudian menggeser kolom lain berdasarkan lokasi.

Artinya, output yang saya harapkan adalah:

# 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
Chris 4 Mei 2018, 12:26

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan 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
1
zipa 8 Mei 2018, 11:11