Saya memiliki dua set data:

  1. Satu berisi sertifikat energi rumah yang dikeluarkan 10 tahun terakhir dengan ID untuk rumah dan tanggal dikeluarkannya. Satu rumah dapat memiliki lebih banyak sertifikat yang diterbitkan, karena mereka dapat memperbaruinya.
  2. Yang lainnya berisi semua transaksi rumah selama 10 tahun terakhir dan ID (Yang id yang sama seperti pada dataset pertama)

Saya telah menggabungkannya menggunakan

mergeALL= pd.merge(mergeTranDwelling,EnergySimple, left_on=['matrikkel2019', "bygningsnr"], right_on=['matrikkel2019', 'Bygningsnummer'], how='inner')

Saya kemudian mendapatkan sesuatu seperti ini (Snippet of dataframe):


transaction_id  address_id  official_date   certificate     issued_date
83866285    1157600091      2016-05-25      A2012-278940    17.12.2012 17:44:17
83866285    1157600091      2016-05-25      A2012-278941    17.12.2012 17:48:35
83866285    1157600091      2016-05-25      A2016-638538    22.02.2016 10:16:12
83866285    1157600091      2016-05-25      A2016-638577    22.02.2016 10:22:45
83866285    1157600091      2016-05-25      A2019-1065662   21.10.2019 15:39:30



Karena setiap rumah dapat memiliki beberapa nilai sertifikat energi, setiap transaksi bisa mendapatkan beberapa sertifikat yang dilampirkan padanya. Saya ingin setiap transaction_id memiliki sertifikat dengan issued_date yang paling dekat tetapi sebelum official_date. Dalam kasus di atas saya ingin menghapus semua sertifikat pada tranasction_id ini kecuali :

83866285    1157600091      2016-05-25      A2016-638577    22.02.2016 10:22:45

Saya telah mencoba menggunakan solusi ini: https://stackoverflow.com/a/60434720/12939497 tetapi saya harus menggabungkan kumpulan data pada dua kolom (matrikkel2019 , bygningsr), oleh karena itu saya tidak dapat menggunakan merge.asof.

Saya juga terbuka untuk melakukan penggabungan dengan cara lain (ini adalah pertanyaan lain tentang masalah yang sama:Menggabungkan dua DataFrames (Dataset) pada spesifik kolom ID tetapi dengan kondisi Tanggal)

1
DannyTG 15 Maret 2020, 16:51

1 menjawab

Jawaban Terbaik

Perpanjang df Anda dengan satu alamat lagi transaction_id untuk pengujian yang lebih baik..dan mengambil kerangka data dari excel, Anda dapat memodifikasi bagian itu sesuai kebutuhan Anda..

input_df

transaction_id  address_id  official_date   certificate issued_date
83866285    1157600091  5/25/2016   A2012-278940    17.12.2012 17:44:17
83866285    1157600091  5/25/2016   A2012-278941    17.12.2012 17:48:35
83866285    1157600091  5/25/2016   A2016-638538    22.02.2016 10:16:12
83866285    1157600091  5/25/2016   A2016-638577    22.02.2016 10:22:45
83866285    1157600091  5/25/2016   A2019-1065662   21.10.2019 15:39:30
83866286    1157600093  5/25/2019   A2012-278940    17.12.2012 17:44:17
83866286    1157600093  5/25/2019   A2012-278941    17.12.2012 17:48:35
83866286    1157600093  5/25/2019   A2016-638538    22.02.2016 10:16:12
83866286    1157600093  5/25/2019   A2016-638577    22.02.2016 10:22:45
83866286    1157600093  5/25/2019   A2019-1065662   21.11.2019 15:39:30

..

import pandas as pd
import numpy
import re

input_df = pd.read_excel('input.xlsx',sheet_name='Sheet1')

# convert columns in date time 

input_df['issued_date'] = pd.to_datetime(input_df['issued_date'])
input_df['official_date'] = pd.to_datetime(input_df['official_date'])

# Add below column just for calculation
input_df['diff_days']= (input_df['issued_date']-input_df['official_date']).abs()
print(input_df)

# Filter the group of transaction_id
input_df=input_df.loc[input_df.groupby('transaction_id').diff_days.idxmin()]

# Now remove temp column
input_df = input_df.drop(['diff_days'], axis=1)
print(input_df)

Keluaran -

   3        83866285  1157600091    2016-05-25   A2016-638577 2016-02-22 10:22:45
   9        83866286  1157600093    2019-05-25  A2019-1065662 2019-11-21 15:39:30
1
Hietsh Kumar 15 Maret 2020, 15:31