Jadi saya memiliki kerangka data panda berikut, diurutkan berdasarkan Timestamp menaik:

Timestamp,Point,Value
2019-09-01,A,1
2019-09-01,B,2
2019-09-02,A,1
2019-09-02,B,2
2019-09-03,A,3
2019-09-03,B,4
2019-09-04,A,3
2019-09-04,B,4
2019-09-05,A,1
2019-09-05,B,2

Kerangka data ini berisi pembacaan nilai "titik" yang berbeda pada saat yang berbeda dalam waktu. Dalam contoh ini, A dan B memiliki pembacaan setiap 1 hari, tetapi beberapa dari nilai tersebut sama dengan pembacaan sebelumnya.

Saya perlu menerapkan transformasi yang hanya akan meninggalkan baris yang kolom Nilainya telah berubah dari pembacaan sebelumnya untuk titik yang sama.

|Timestamp |Point|Value|
|----------|-----|-----|
|2019-09-01|A    |1    | // A = 1
|2019-09-01|B    |2    | // B = 2 
|2019-09-02|A    |1    | // A unchanged, should be removed
|2019-09-02|B    |2    | // B unchanged, should be removed
|2019-09-03|A    |3    | // A = 3
|2019-09-03|B    |4    | // B = 4
|2019-09-04|A    |3    | // A unchanged, should be removed
|2019-09-04|B    |4    | // B unchanged, should be removed
|2019-09-05|A    |1    | // A = 1
|2019-09-05|B    |2    | // B = 2

Dalam contoh yang disederhanakan ini, saya ingin mendapatkan kerangka data seperti berikut. Hanya menyertakan nilai yang berbeda dari pembacaan sebelumnya untuk poin yang sama.

|Timestamp |Point|Value|
|----------|-----|-----|
|2019-09-01|A    |1    |
|2019-09-01|B    |2    |
|2019-09-03|A    |3    |
|2019-09-03|B    |4    |
|2019-09-05|A    |1    |
|2019-09-05|B    |2    |
1
empz 23 Januari 2020, 14:32

2 jawaban

Jawaban Terbaik

Anda dapat membentuk kembali kerangka data untuk memiliki Stempel Waktu unik sebagai baris dan Poin sebagai kolom , lalu periksa apakah ada perubahan lain assign nan dan stack():

m = df.set_index(['Timestamp','Point']).unstack().where(lambda x:
                           x.ne(x.shift())).stack().reset_index()

Atau pecah menjadi 2 baris:

m = df.set_index(['Timestamp','Point']).unstack()
m = m.where(m.ne(m.shift())).stack().reset_index()

print(m) 

    Timestamp Point  Value
0  2019-09-01     A    1.0
1  2019-09-01     B    2.0
2  2019-09-03     A    3.0
3  2019-09-03     B    4.0
4  2019-09-05     A    1.0
5  2019-09-05     B    2.0
2
anky 23 Januari 2020, 11:40

Anda dapat mencoba pengindeksan boolean, pertama urutkan berdasarkan Timestamp, kelompokkan Point dan periksa apakah diff (selisih antara 2 baris berturut-turut) dari Value tidak sama dengan 0:

df[df.sort_values('Timestamp').groupby('Point')['Value'].diff().ne(0)]

[di luar]

   Timestamp Point  Value
0 2019-09-01     A      1
1 2019-09-01     B      2
4 2019-09-03     A      3
5 2019-09-03     B      4
8 2019-09-05     A      1
9 2019-09-05     B      2
2
Chris A 23 Januari 2020, 11:37