Mam ramkę danych z powtarzającymi się wartościami w kolumnie A. Chcę usunąć duplikaty, zachowując wiersz z najwyższą wartością w kolumnie B.
Więc to:
A B
1 10
1 20
2 30
2 40
3 10
Powinien zmienić się w to:
A B
1 20
2 40
3 10
Wes dodał kilka fajnych funkcji do usuwania duplikatów: http://wesmckinney.com/blog/?p=340 . Ale AFAICT, jest przeznaczony do dokładnych duplikatów, więc nie ma wzmianki o kryteriach wyboru, które wiersze mają zostać zachowane.
Domyślam się, że prawdopodobnie istnieje łatwy sposób na zrobienie tego - może tak prosty jak posortowanie ramki danych przed usunięciem duplikatów - ale nie znam wewnętrznej logiki Groupby na tyle dobrze, aby to rozgryźć. Jakieś sugestie?
python
duplicates
pandas
Abe
źródło
źródło
Odpowiedzi:
To trwa ostatnie. Jednak nie maksimum:
Możesz też zrobić coś takiego:
źródło
cols
itake_last
są amortyzowane i zostały zastąpione parametramisubset
ikeep
. 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')
? Chodzi mi o to, że te wartości sort_values wydają mi się bezpieczne, ale nie mam pojęcia, czy tak jest.group_by
, możesz dodać.reset_index(drop=True)
df.groupby(['A','C'], group_keys=False).apply(lambda x: x.ix[x.B.idxmax()]).reset_index(drop=True)
Spowoduje to zresetowanie indeksu, ponieważ jego domyślną wartością będzie Multindex compsed from'A'
i'C'
Najlepsza odpowiedź to za dużo pracy i wygląda na bardzo powolną w przypadku większych zbiorów danych.
apply
jest powolny i należy go unikać, jeśli to możliwe.ix
jest przestarzały i należy go również unikać.Lub po prostu pogrupuj według wszystkich innych kolumn i wybierz maksimum z kolumny, której potrzebujesz.
df.groupby('A', as_index=False).max()
źródło
lamba
funkcji podczas upuszczania. Na przykład, jak mogę upuścić tylko wartości mniejsze niż powiedzmy średnia tych zduplikowanych wartości.Najprostsze rozwiązanie:
Aby usunąć duplikaty na podstawie jednej kolumny:
Aby usunąć duplikaty na podstawie wielu kolumn:
źródło
Spróbuj tego:
źródło
Najpierw posortowałbym ramkę danych w kolejności malejącej z kolumny B, a następnie upuścił duplikaty dla kolumny A i zostawiłbym jako pierwszy
bez żadnego groupby
źródło
Ty też możesz spróbować
Odniosłem to z https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
źródło
Myślę, że w twoim przypadku tak naprawdę nie potrzebujesz grupy. Sortuję według malejącej kolejności kolumny B, a następnie upuszczam duplikaty w kolumnie A, a jeśli chcesz, możesz również mieć nowy ładny i czysty indeks, taki jak ten:
źródło
Oto wariacja, którą musiałem rozwiązać, którą warto udostępnić: dla każdego unikalnego ciągu
columnA
chciałem znaleźć najpopularniejszy powiązany ciągcolumnB
.df.groupby('columnA').agg({'columnB': lambda x: x.mode().any()}).reset_index()
.any()
Wybiera jedną czy jest remis dla trybu. (Zwróć uwagę, że użycie.any()
seriiint
s zwraca wartość logiczną, a nie wybranie jednej z nich).W przypadku pierwotnego pytania odpowiednie podejście upraszcza się do
df.groupby('columnA').columnB.agg('max').reset_index()
.źródło
Gdy już podane posty odpowiadają na to pytanie, dokonałem małej zmiany dodając nazwę kolumny, na której zastosowano funkcję max () dla lepszej czytelności kodu.
źródło
Najłatwiej to zrobić:
źródło
to też działa:
źródło
Nie mam zamiaru udzielić Ci całej odpowiedzi (i tak nie sądzę, że szukasz parsowania i zapisywania do pliku), ale powinna wystarczyć kluczowa wskazówka: użyj
set()
funkcji Pythona , a następniesorted()
lub w.sort()
połączeniu z.reverse()
:źródło