Szukam sposobu, aby zrobić odpowiednik SQL
SELECT DISTINCT col1, col2 FROM dataframe_table
Pandy SQL porównanie nie ma nic na temat distinct
.
.unique()
działa tylko dla jednej kolumny, więc przypuszczam, że mógłbym połączyć kolumny lub umieścić je na liście / krotce i porównać w ten sposób, ale wydaje się, że pandy powinny robić coś w bardziej natywny sposób.
Czy brakuje mi czegoś oczywistego, czy nie ma sposobu, aby to zrobić?
df.apply(pd.Series.unique)
ale to nie zadziała, jeśli liczba unikalnych wartości różni się w kolumnach, więc musisz skonstruować dyktowanie nazw kolumn jako kluczy i unikalnych wartości jako wartościOdpowiedzi:
Możesz użyć tej
drop_duplicates
metody, aby uzyskać unikalne wiersze w DataFrame:Możesz również podać
subset
argument słowa kluczowego, jeśli chcesz używać tylko niektórych kolumn do określenia niepowtarzalności. Zobacz docstring .źródło
df.drop_duplicates()
domyślnie nie jest metodą inplace, więc zwraca nową ramkę DataFrame (pozostawiającdf
niezmienioną). Jest to dość standardowe zachowanie, ale nadal może być przydatne.Próbowałem różnych rozwiązań. Najpierw było:
i działa dobrze dla danych niebędących obiektami Innym sposobem na zrobienie tego i uniknięcie błędów (dla kolumn typu obiektu) jest zastosowanie drop_duplicates ()
Możesz również użyć SQL, aby to zrobić, ale w moim przypadku działało to bardzo wolno:
źródło
Nie ma
unique
metody dla df, jeśli liczba unikalnych wartości dla każdej kolumny byłaby taka sama, zadziałałyby następujące działania:df.apply(pd.Series.unique)
ale jeśli nie, otrzymasz błąd. Innym podejściem byłoby przechowywanie wartości w dictwie, który jest wpisany w nazwę kolumny:źródło
np.unique(df[['column1','column2']].values)
Aby rozwiązać podobny problem, używam
groupby
:To, czy będzie to właściwe, będzie zależeć od tego, co chcesz zrobić z wynikiem (w moim przypadku chciałem tylko odpowiednika tego,
COUNT DISTINCT
co pokazano).źródło
Myślę, że użycie
drop duplicate
czasami nie będzie tak przydatne w zależności od ramki danych.Znalazłem to:
I pracuj dla mnie!
https://riptutorial.com/pandas/example/26077/select-distinct-rows-across-dataframe
źródło
Możesz wziąć zestawy kolumn i po prostu odjąć mniejszy zestaw od większego zestawu:
źródło