Pandalarda birden çok veri çerçevesi sütununda "farklı" nasıl seçilir?


110

SQL ile eşdeğerini yapmanın bir yolunu arıyorum

SELECT DISTINCT col1, col2 FROM dataframe_table

Pandaların sql karşılaştırmasının hiçbir anlamı yok distinct.

.unique() yalnızca tek bir sütun için çalışır, bu yüzden sütunları birleştirebilirim veya onları bir liste / demete koyabilir ve bu şekilde karşılaştırabilirim, ancak bu pandaların daha doğal bir şekilde yapması gereken bir şey gibi görünüyor.

Bariz bir şeyi mi kaçırıyorum yoksa bunu yapmanın bir yolu yok mu?


Bunun gibi bir şey yapmanız gerekirdi, df.apply(pd.Series.unique)ancak benzersiz değerlerin sayısı sütunlar arasında değişiyorsa bu işe yaramaz, bu nedenle sütun adlarının anahtar olarak ve benzersiz değerler olarak bir
diktesini oluşturmanız gerekir

Yanıtlar:


183

drop_duplicatesDataFrame'deki benzersiz satırları almak için yöntemi kullanabilirsiniz :

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

subsetBenzersizliği belirlemek için yalnızca belirli sütunları kullanmak istiyorsanız , anahtar kelime bağımsız değişkenini de sağlayabilirsiniz . Dokümana bakın .


5
Muhtemelen df.drop_duplicates(), varsayılan olarak yerinde bir yöntem olmadığını belirtmekte fayda var , bu nedenle yeni bir DataFrame döndürür ( dfdeğişmeden bırakılır). Bu oldukça standart bir davranıştır, ancak yine de faydalı olabilir.
evophage

15

Farklı çözümler denedim. Birincisi:

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

ve nesne verisi olmadığında iyi çalışır Bunu yapmanın ve hatayı önlemenin başka bir yolu (nesne sütun türü için) drop_duplicates () uygulamaktır.

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

Bunu yapmak için SQL de kullanabilirsiniz, ancak benim durumumda çok yavaş çalıştı:

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

7

uniqueBir df için bir yöntem yoktur , eğer her sütun için benzersiz değerlerin sayısı aynıysa, o zaman aşağıdakiler işe df.apply(pd.Series.unique)yarar : ancak değilse, o zaman bir hata alırsınız. Diğer bir yaklaşım, değerleri sütun adı üzerine yazılmış bir diktede saklamak olacaktır:

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)}

birden çok sütun için benzersiz olup olmadığını kontrol etmek mümkün mü?
Anoop D

Numpy kullanarak başka SO sorudan cevabı varnp.unique(df[['column1','column2']].values)
Anoop D'yi

7

Benzer bir sorunu çözmek için kullanıyorum groupby:

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

Bunun uygun olup olmadığı, sonuçla ne yapmak istediğinize bağlı olacaktır (benim durumumda, sadece COUNT DISTINCTgösterildiği gibi eşdeğerini istedim ).



-1

Sütun kümelerini alıp daha küçük kümeyi büyük kümeden çıkarabilirsiniz:

distinct_values = set(df['a'])-set(df['b'])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.