Saya mencari cara agar saya dapat menghitung berapa kali harga suatu produk berubah dari waktu ke waktu. Tidak hanya menghitung nilai unqiue karena saya juga perlu menghitung perubahan ketika harga kembali ke harga lama.

Berikut adalah ikhtisar singkat dari apa yang saya miliki:

IN: df['price'].xs(486186506)

OUT:
Grabbed                   Price
2019-12-06 13:29:05       199
2019-12-13 14:17:41       199
2020-01-25 11:01:39       199
2020-01-25 11:04:46       199
2020-01-25 12:00:41    186.18
2020-01-25 12:02:26    186.18
2020-01-25 12:05:57    186.18
2020-01-25 12:11:07    186.18
2020-01-31 07:56:06       199
2020-01-31 07:57:00       199
2020-01-31 07:59:15       199
2020-02-14 16:29:14       229
2020-02-15 16:25:14       229
2020-02-18 16:25:15       199
Name: price, dtype: object

Jadi yang bisa Anda lihat di sini adalah harganya berubah 4 kali lipat.

199 -> 186,15

186,15 -> 199

199 -> 229

229 -> 199

Saya memiliki sekitar 25k indeks unik dalam kerangka data saya dan saya perlu melakukan ini untuk setiap indeks.

1
Brekers 28 Maret 2020, 19:09

1 menjawab

Jawaban Terbaik

Ada MultiIndex, jadi gunakan DataFrameGroupBy.diff untuk perbedaan per level pertama, kemudian tidak sama dengan Series.ne, sum per tingkat pertama, ubah ke bilangan bulat dan terakhir kurangi 1 karena nilai perbedaan pertama tidak ada nilai:

df1 = (df.groupby(level=0)['price'].diff()
         .ne(0)
         .sum(level=0)
         .astype(int)
         .sub(1)
         .reset_index(name='count'))
print (df1)
          id  count
0  486186506      4

Atau bandingkan nilai yang bergeser per grup dengan DataFrameGroupBy.shift dengan orisinal untuk tidak sama dan kemudian solusinya sama seperti di atas:

df1 = (df['price'].ne(df.groupby(level=0)['price'].shift())
                  .sum(level=0)
                  .astype(int)
                  .sub(1)
                  .reset_index(name='count'))
print (df1)
          id  count
0  486186506      4

Contoh data:

print (df)
                                price
id        Grabbed                    
486186506 2019-12-06 13:29:05  199.00
          2019-12-13 14:17:41  199.00
          2020-01-2511:01:39   199.00
          2020-01-25 11:04:46  199.00
          2020-01-25 12:00:41  186.18
          2020-01-25 12:02:26  186.18
          2020-01-25 12:05:57  186.18
          2020-01-25 12:11:07  186.18
          2020-01-31 07:56:06  199.00
          2020-01-31 07:57:00  199.00
          2020-01-31 07:59:15  199.00
          2020-02-14 16:29:14  229.00
          2020-02-15 16:25:14  229.00
          2020-02-18 16:25:15  199.00
2
jezrael 28 Maret 2020, 16:29