Saya memiliki kerangka data dengan nilai berulang di kolom A. Saya ingin menjatuhkan duplikat, menjaga baris dengan nilai tertinggi di kolom B.
Jadi ini:
A B
1 10
1 20
2 30
2 40
3 10
Harus berubah menjadi ini:
A B
1 20
2 40
3 10
Wes telah menambahkan beberapa fungsionalitas yang bagus untuk menjatuhkan duplikat: http://wesmckinney.com/blog/?p=340 . Tapi AFAICT, ini dirancang untuk duplikat yang tepat, jadi tidak disebutkan kriteria untuk memilih baris mana yang disimpan.
Saya menduga mungkin ada cara mudah untuk melakukan ini --- mungkin semudah mengurutkan dataframe sebelum menjatuhkan duplikat --- tapi saya tidak tahu logika internal groupby cukup baik untuk mengetahuinya. Ada saran?
python
duplicates
pandas
Abe
sumber
sumber
Jawaban:
Ini yang terakhir. Tidak maksimal:
Anda juga dapat melakukan sesuatu seperti:
sumber
cols
dantake_last
parameter disusutkan dan telah digantikan olehsubset
dankeep
parameter. pandas.pydata.org/pandas-docs/version/0.17.1/generated/…FutureWarning: the take_last=True keyword is deprecated, use keep='last' instead
df.sort_values(by=['B']).drop_duplicates(subset=['A'], keep='last')
? Maksud saya sort_values ini tampaknya aman bagi saya, tetapi saya tidak tahu apakah itu benar-benar aman.group_by
, Anda dapat menambahkan.reset_index(drop=True)
df.groupby(['A','C'], group_keys=False).apply(lambda x: x.ix[x.B.idxmax()]).reset_index(drop=True)
Ini akan mengatur ulang indeks karena nilai defaultnya adalah Multindex yang berasal dari'A'
dan'C'
Jawaban teratas adalah melakukan terlalu banyak pekerjaan dan terlihat sangat lambat untuk set data yang lebih besar.
apply
lambat dan harus dihindari jika memungkinkan.ix
sudah usang dan harus dihindari juga.Atau cukup kelompokkan dengan semua kolom lain dan ambil maks kolom yang Anda butuhkan.
df.groupby('A', as_index=False).max()
sumber
lamba
fungsi saat menjatuhkan. Misalnya bagaimana saya bisa menjatuhkan hanya nilai yang lebih rendah dari rata-rata nilai duplikat tersebutSolusi paling sederhana:
Untuk menjatuhkan duplikat berdasarkan satu kolom:
Untuk menjatuhkan duplikat berdasarkan beberapa kolom:
sumber
Coba ini:
sumber
Saya akan mengurutkan dataframe pertama dengan Kolom B turun, kemudian drop duplikat untuk Kolom A dan pertahankan terlebih dahulu
tanpa groupby
sumber
Anda dapat mencoba ini juga
Saya merujuk ini dari https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
sumber
Saya pikir dalam kasus Anda, Anda tidak benar-benar membutuhkan grup. Saya akan menyortir dengan urutan menurun kolom B Anda, kemudian drop duplikat di kolom A dan jika Anda mau, Anda juga dapat memiliki indeks bagus dan bersih baru seperti itu:
sumber
Berikut variasi yang harus saya pecahkan yang layak dibagikan: untuk setiap string unik di
columnA
saya ingin menemukan string terkait yang paling umumcolumnB
.df.groupby('columnA').agg({'columnB': lambda x: x.mode().any()}).reset_index()
The
.any()
mengambil satu jika ada dasi untuk mode. (Perhatikan bahwa menggunakan.any()
pada Seriint
s mengembalikan boolean daripada memilih salah satunya.)Untuk pertanyaan awal, pendekatan yang sesuai disederhanakan
df.groupby('columnA').columnB.agg('max').reset_index()
.sumber
Ketika sudah diberikan tulisan, jawab pertanyaan itu, saya membuat perubahan kecil dengan menambahkan nama kolom tempat fungsi max () diterapkan untuk keterbacaan kode yang lebih baik.
sumber
Cara termudah untuk melakukan ini:
sumber
ini juga berfungsi:
sumber
Saya tidak akan memberikan Anda seluruh jawaban (saya tidak berpikir Anda sedang mencari bagian parsing dan menulis untuk mengajukan), tetapi petunjuk penting harus mencukupi: gunakan
set()
fungsi python , lalusorted()
atau.sort()
ditambah dengan.reverse()
:sumber