Letakkan semua baris duplikat di Python Pandas

159

The pandas drop_duplicatesfungsi besar untuk "uniquifying" dataframe a. Namun, salah satu argumen kata kunci yang harus dilewati adalah take_last=Trueatau take_last=False, sementara saya ingin menghapus semua baris yang merupakan duplikat di seluruh bagian kolom. Apakah ini mungkin?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

Sebagai contoh, saya ingin menjatuhkan baris yang cocok pada kolom Adan Cjadi ini harus drop baris 0 dan 1.

Jamie Bull
sumber

Jawaban:

233

Ini jauh lebih mudah di panda sekarang dengan drop_duplicates dan parameter keep.

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)
Ben
sumber
2
Bagaimana jika kolom saya tidak diberi label secara eksplisit? Bagaimana cara memilih kolom hanya berdasarkan indeks mereka?
Hamman Samuel
2
Mungkin df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
Ben
5
Anda bisa mencobadf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi
67

Hanya ingin menambahkan jawaban Ben di drop_duplicates :

keep : {'first', 'last', False}, default 'first'

  • pertama: Jatuhkan duplikat kecuali untuk kejadian pertama.

  • terakhir: Jatuhkan duplikat kecuali untuk kejadian terakhir.

  • Salah: Jatuhkan semua duplikat.

Jadi pengaturan keepke False akan memberikan jawaban yang Anda inginkan.

DataFrame.drop_duplicates (* args, ** kwargs) Kembalikan DataFrame dengan baris duplikat dihapus, secara opsional hanya mempertimbangkan kolom tertentu

Parameter: subset: label kolom atau urutan label, opsional Hanya pertimbangkan kolom tertentu untuk mengidentifikasi duplikat, secara default gunakan semua kolom: {'first', 'last', False}, default 'first' first: Drop duplikat kecuali untuk kejadian pertama. terakhir: Jatuhkan duplikat kecuali untuk kejadian terakhir. Salah: Jatuhkan semua duplikat. take_last: usang inplace: boolean, default False Apakah untuk menjatuhkan duplikat di tempat atau untuk mengembalikan salinan cols: kwargs hanya argumen dari subset [ditinggalkan] Pengembalian: deduplikasi: DataFrame

Jake
sumber
25

Jika Anda ingin hasilnya disimpan dalam dataset lain:

df.drop_duplicates(keep=False)

atau

df.drop_duplicates(keep=False, inplace=False)

Jika dataset yang sama perlu diperbarui:

df.drop_duplicates(keep=False, inplace=True)

Contoh di atas akan menghapus semua duplikat dan menyimpannya, mirip dengan DISTINCT *di SQL

Ramanujam Allam
sumber
11

gunakan groupbydanfilter

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)
HYRY
sumber
4

Sebenarnya, hanya baris drop 0 dan 1 yang diperlukan (setiap pengamatan yang mengandung A dan C yang cocok disimpan.):

In [335]:

df['AC']=df.A+df.C
In [336]:

print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
     A  B  C    AC
2  foo  1  B  fooB
3  bar  1  A  barA

[2 rows x 4 columns]

Tapi saya menduga apa yang Anda inginkan adalah ini (satu pengamatan yang berisi A dan C yang cocok disimpan.):

In [337]:

print df.drop_duplicates('AC')
     A  B  C    AC
0  foo  0  A  fooA
2  foo  1  B  fooB
3  bar  1  A  barA

[3 rows x 4 columns]

Edit:

Sekarang jauh lebih jelas, oleh karena itu:

In [352]:
DG=df.groupby(['A', 'C'])   
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]
CT Zhu
sumber
1
Jika itu yang saya inginkan, saya hanya akan menggunakan df.drop_duplicates(['A','C'])sebagai default membuat satu pengamatan mengambil yang pertama atau terakhir seperti yang saya sebutkan dalam pertanyaan - meskipun saya baru menyadari bahwa kata kunci saya salah karena saya menulis dari memori. Yang saya inginkan adalah menghapus semua baris yang identik pada kolom minat (A dan C dalam contoh data).
Jamie Bull
-1

Cobalah berbagai hal ini

df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')

atau

>>>df.drop_duplicates( keep='first')

atau

>>>df.drop_duplicates( keep='last')
Gupta Priyansh
sumber