Bagaimana cara menemukan semua baris dalam kerangka data panda yang memiliki nilai maksimum untuk count
kolom, setelah dikelompokkan berdasarkan ['Sp','Mt']
kolom?
Contoh 1: dataFrame berikut, yang saya kelompokkan ['Sp','Mt']
:
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
Output yang diharapkan: dapatkan baris hasil yang hitungnya maksimum di antara grup, seperti:
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
Contoh 2: bingkai data ini, yang saya kelompokkan dengan ['Sp','Mt']
:
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
Untuk contoh di atas, saya ingin mendapatkan semua baris di mana count
sama dengan maks, di setiap kelompok mis:
MM2 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
python
pandas
max
pandas-groupby
jojo12
sumber
sumber
1 3
?Jawaban:
Untuk mendapatkan indeks DF asli yang dapat Anda lakukan:
Perhatikan bahwa jika Anda memiliki beberapa nilai maks per grup, semua akan dikembalikan.
Memperbarui
Pada kesempatan hujan es bahwa inilah yang diminta OP:
sumber
idx
pendekatan kedua . Tapi, saya hanya mampu membayar maksimum satu untuk setiap grup (dan data saya memiliki beberapa duplikat-maks). apakah ada cara untuk mengatasi ini dengan solusi Anda?transform
metode mungkin memiliki kinerja kumpulan ketika kumpulan data cukup besar, dapatkan nilai maks terlebih dahulu kemudian gabungkan dataframe akan lebih baik.Anda bisa mengurutkan dataFrame berdasarkan hitungan dan kemudian menghapus duplikat. Saya pikir ini lebih mudah:
sumber
inplace = True
sebagai argumen untukdrop_duplicates
Solusi mudahnya adalah dengan menerapkan: idxmax () berfungsi untuk mendapatkan indeks baris dengan nilai maksimal. Ini akan memfilter semua baris dengan nilai maksimal dalam grup.
sumber
"I want to get ALL the rows where count equals max in each group"
, sementaraidxmax
Return[s] index of first occurrence of maximum over requested axis"
menurut dokumen (0,21).Setelah mencoba solusi yang disarankan oleh Zelazny pada DataFrame yang relatif besar (~ 400k baris) saya merasa sangat lambat. Berikut adalah alternatif yang saya temukan untuk menjalankan pesanan yang jauh lebih cepat pada kumpulan data saya.
sumber
df[df['count'] == df['count_max']]
akan kehilangan baris NaN, serta jawaban di atas.Anda mungkin tidak perlu melakukan dengan grup dengan, menggunakan
sort_values
+drop_duplicates
Logikanya juga hampir sama dengan menggunakan
tail
sumber
Bagi saya, solusi termudah adalah menjaga nilai ketika jumlah sama dengan maksimum. Oleh karena itu, perintah satu baris berikut sudah cukup:
sumber
Gunakan
groupby
danidxmax
metode:transfer col
date
kedatetime
:dapatkan indeks
max
kolomdate
, setelahgroupyby ad_id
:dapatkan data yang diinginkan:
Keluar [54]:
sumber
sumber
Menyadari bahwa "menerapkan" "nlargest" ke objek groupby berfungsi dengan baik:
Keuntungan tambahan - juga dapat mengambil nilai n atas jika diperlukan:
sumber
Coba gunakan "nlargest" pada objek groupby. Keuntungan menggunakan nlargest adalah ia mengembalikan indeks baris tempat "item nlargest" diambil. Catatan: kami mengiris elemen kedua (1) dari indeks kami karena indeks kami dalam hal ini terdiri dari tupel (mis. (S1, 0)).
masukkan deskripsi gambar di sini
sumber
Saya telah menggunakan gaya fungsional ini untuk banyak operasi grup:
.reset_index(drop=True)
membuat Anda kembali ke indeks asli dengan menjatuhkan indeks grup.sumber