Bagaimana cara "memilih yang berbeda" di beberapa kolom bingkai data di panda?

101

Saya mencari cara untuk melakukan hal yang setara dengan SQL

SELECT DISTINCT col1, col2 FROM dataframe_table

Perbandingan panda sql tidak memiliki apa-apa distinct.

.unique() hanya berfungsi untuk satu kolom, jadi saya kira saya dapat menggabungkan kolom, atau memasukkannya ke dalam daftar / tupel dan membandingkannya, tetapi ini sepertinya sesuatu yang harus dilakukan panda dengan cara yang lebih asli.

Apakah saya melewatkan sesuatu yang jelas, atau tidak ada cara untuk melakukan ini?

Jody
sumber
Anda harus melakukan sesuatu seperti df.apply(pd.Series.unique)tetapi ini tidak akan berfungsi jika jumlah nilai unik bervariasi di seluruh kolom sehingga Anda harus membuat dikt nama kolom sebagai kunci dan nilai unik sebagai nilainya
EdChum
Dokumentasi SO
pengguna2314737

Jawaban:

172

Anda dapat menggunakan drop_duplicatesmetode untuk mendapatkan baris unik di DataFrame:

In [29]: df = pd.DataFrame({'a':[1,2,1,2], 'b':[3,4,3,5]})

In [30]: df
Out[30]:
   a  b
0  1  3
1  2  4
2  1  3
3  2  5

In [32]: df.drop_duplicates()
Out[32]:
   a  b
0  1  3
1  2  4
3  2  5

Anda juga dapat memberikan subsetargumen kata kunci jika Anda hanya ingin menggunakan kolom tertentu untuk menentukan keunikan. Lihat docstring .

joris
sumber
3
Mungkin perlu dicatat bahwa df.drop_duplicates()secara default bukan metode inplace, jadi kembalikan DataFrame baru (biarkan dftidak berubah). Ini adalah perilaku yang cukup standar, tetapi mungkin masih berguna.
evophage
13

Saya sudah mencoba solusi yang berbeda. Pertama adalah:

a_df=np.unique(df[['col1','col2']], axis=0)

dan berfungsi dengan baik untuk bukan data objek Cara lain untuk melakukan ini dan untuk menghindari kesalahan (untuk tipe kolom objek) adalah dengan menerapkan drop_duplicates ()

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]

Anda juga dapat menggunakan SQL untuk melakukan ini, tetapi itu bekerja sangat lambat dalam kasus saya:

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)
Dompet Yury
sumber
7

Tidak ada uniquemetode untuk df, jika jumlah nilai unik untuk setiap kolom sama maka berikut ini akan berhasil: df.apply(pd.Series.unique)tetapi jika tidak maka Anda akan mendapatkan kesalahan. Pendekatan lain adalah dengan menyimpan nilai dalam sebuah dict yang dikunci pada nama kolom:

In [111]:
df = pd.DataFrame({'a':[0,1,2,2,4], 'b':[1,1,1,2,2]})
d={}
for col in df:
    d[col] = df[col].unique()
d

Out[111]:
{'a': array([0, 1, 2, 4], dtype=int64), 'b': array([1, 2], dtype=int64)}
EdChum
sumber
apakah mungkin untuk memeriksa unique untuk beberapa kolom?
Anoop D
Mendapat jawaban dari pertanyaan SO lain menggunakan numpynp.unique(df[['column1','column2']].values)
Anoop D
6

Untuk mengatasi masalah serupa, saya menggunakan groupby:

print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")

Apakah itu sesuai akan tergantung pada apa yang ingin Anda lakukan dengan hasilnya, meskipun (dalam kasus saya, saya hanya ingin yang setara COUNT DISTINCTdengan yang ditunjukkan).

ncoghlan.dll
sumber
-1

Anda dapat mengambil set kolom dan mengurangi set yang lebih kecil dari set yang lebih besar:

distinct_values = set(df['a'])-set(df['b'])
Dorante
sumber