Mam następujące DataFrame:
daysago line_race rating rw wrating
line_date
2007-03-31 62 11 56 1.000000 56.000000
2007-03-10 83 11 67 1.000000 67.000000
2007-02-10 111 9 66 1.000000 66.000000
2007-01-13 139 10 83 0.880678 73.096278
2006-12-23 160 10 88 0.793033 69.786942
2006-11-09 204 9 52 0.636655 33.106077
2006-10-22 222 8 66 0.581946 38.408408
2006-09-29 245 9 70 0.518825 36.317752
2006-09-16 258 11 68 0.486226 33.063381
2006-08-30 275 8 72 0.446667 32.160051
2006-02-11 475 5 65 0.164591 10.698423
2006-01-13 504 0 70 0.142409 9.968634
2006-01-02 515 0 64 0.134800 8.627219
2005-12-06 542 0 70 0.117803 8.246238
2005-11-29 549 0 70 0.113758 7.963072
2005-11-22 556 0 -1 0.109852 -0.109852
2005-11-01 577 0 -1 0.098919 -0.098919
2005-10-20 589 0 -1 0.093168 -0.093168
2005-09-27 612 0 -1 0.083063 -0.083063
2005-09-07 632 0 -1 0.075171 -0.075171
2005-06-12 719 0 69 0.048690 3.359623
2005-05-29 733 0 -1 0.045404 -0.045404
2005-05-02 760 0 -1 0.039679 -0.039679
2005-04-02 790 0 -1 0.034160 -0.034160
2005-03-13 810 0 -1 0.030915 -0.030915
2004-11-09 934 0 -1 0.016647 -0.016647
Muszę usunąć wiersze, w których line_race
jest równa 0
. Jaki jest najbardziej efektywny sposób to zrobić?
Odpowiedzi:
Jeśli dobrze rozumiem, powinno to być tak proste, jak:
źródło
df
jest duża? Czy mogę to zrobić na miejscu?df
z rzędami 2M i poszło dość szybko.df = df[df['line race'] != 0]
df=df[~df['DATE'].isin(['2015-10-30.1', '2015-11-30.1', '2015-12-31.1'])]
Ale w przypadku przyszłych pomijaczy możesz wspomnieć, że
df = df[df.line_race != 0]
nic nie robi, gdy próbujesz odfiltrowaćNone
/ brakujące wartości.Działa:
Nic nie robi:
Działa:
źródło
df = df[df.columns[2].notnull()]
, ale w taki czy inny sposób musisz być w stanie jakoś zindeksować kolumnę.df = df[df.line_race != 0]
upuszcza wiersze, ale także nie resetuje indeksu. Więc kiedy dodasz kolejny wiersz w pliku df, może on nie zostać dodany na końcu. Polecam zresetować indeks po tej operacji (df = df.reset_index(drop=True)
)==
Aby rozpocząć, nigdy nie należy porównywać z operatorem Brak . stackoverflow.com/questions/3257919/…Najlepszym sposobem na to jest maskowanie logiczne:
AKTUALIZACJA: Teraz, gdy pandy 0.13 są już dostępne, innym sposobem na to jest
df.query('line_race != 0')
.źródło
query
. Pozwala na bardziej szczegółowe kryteria wyboru (np. Operacje podobne do zestawu, takie jakdf.query('variable in var_list')
gdzie „zmienna_lista” jest listą pożądanych wartości)query
nie jest bardzo przydatne, jeśli nazwa kolumny zawiera spację.df = df.rename(columns=lambda x: x.strip().replace(' ','_'))
aby dodać kolejne rozwiązanie, szczególnie przydatne, jeśli korzystasz z nowych oceniających pand, inne rozwiązania zastąpią oryginalne pandy i utracą osoby oceniające
źródło
.reset_index()
również to zrobić, jeśli ktoś ostatecznieJeśli chcesz usunąć wiersze na podstawie wielu wartości kolumny, możesz użyć:
Aby usunąć wszystkie wiersze o wartościach 0 i 10 dla
line_race
.źródło
Podana odpowiedź jest jednak poprawna, ponieważ ktoś powyżej powiedział, że możesz jej użyć,
df.query('line_race != 0')
co w zależności od twojego problemu jest znacznie szybsze. Wysoce zalecane.źródło
DataFrame
nazwy zmiennych, takie jak ja (i zgaduję, że wszyscy w porównaniu dodf
przykładów), ponieważ musisz napisać tylko raz.Chociaż poprzednie odpowiedzi są prawie podobne do tego, co zamierzam zrobić, ale użycie metody index nie wymaga użycia innej metody indeksowania .loc (). Można to zrobić w podobny, ale precyzyjny sposób jak
źródło
Kolejny sposób to zrobić. Może nie być najbardziej wydajnym sposobem, ponieważ kod wygląda na nieco bardziej skomplikowany niż kod wymieniony w innych odpowiedziach, ale może być alternatywnym sposobem robienia tego samego.
źródło
Po prostu dodanie innego sposobu dla DataFrame rozwiniętego we wszystkich kolumnach:
Przykład:
źródło