Ich habe den folgenden 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
Ich muss die Zeilen entfernen, in denen line_race
gleich ist 0
. Was ist der effizienteste Weg, dies zu tun?
Antworten:
Wenn ich richtig verstehe, sollte es so einfach sein wie:
quelle
df
es groß ist? Oder kann ich es an Ort und Stelle tun?df
mit 2M Reihen und es ging ziemlich schnell.df = df[df['line race'] != 0]
df=df[~df['DATE'].isin(['2015-10-30.1', '2015-11-30.1', '2015-12-31.1'])]
Aber für zukünftige Bypässe könnte man erwähnen, dass
df = df[df.line_race != 0]
dies nichts bewirkt, wenn versucht wird, nachNone
/ fehlenden Werten zu filtern .Funktioniert:
Tut nichts:
Funktioniert:
quelle
df = df[df.columns[2].notnull()]
, aber auf die eine oder andere Weise müssen Sie in der Lage sein, die Spalte irgendwie zu indizieren.df = df[df.line_race != 0]
löscht die Zeilen, setzt aber auch den Index nicht zurück. Wenn Sie also eine weitere Zeile in die df einfügen, wird diese möglicherweise am Ende nicht hinzugefügt. Ich würde empfehlen, den Index nach dieser Operation zurückzusetzen (df = df.reset_index(drop=True)
)==
zu startenden Operator vergleichen . stackoverflow.com/questions/3257919/…Der beste Weg, dies zu tun, ist die boolesche Maskierung:
UPDATE: Jetzt, da Pandas 0.13 herauskommt, ist eine andere Möglichkeit, dies zu tun
df.query('line_race != 0')
.quelle
query
. Es ermöglicht umfangreichere Auswahlkriterien (z. B.df.query('variable in var_list')
satzähnliche Operationen wie 'var_list' ist eine Liste der gewünschten Werte)query
ist nicht sehr nützlich, wenn der Spaltenname ein Leerzeichen enthält.df = df.rename(columns=lambda x: x.strip().replace(' ','_'))
Nur um eine weitere Lösung hinzuzufügen, die besonders nützlich ist, wenn Sie die neuen Pandas-Prüfer verwenden, ersetzen andere Lösungen die ursprünglichen Pandas und verlieren die Prüfer
quelle
.reset_index()
auch, wenn jemand Index-Accessoren verwendetWenn Sie Zeilen basierend auf mehreren Werten der Spalte löschen möchten, können Sie Folgendes verwenden:
Alle Zeilen mit den Werten 0 und 10 für löschen
line_race
.quelle
drop = [0, 10]
df[(df.line_race != drop)]
Die gegebene Antwort ist dennoch richtig, da jemand oben sagte, dass Sie verwenden können,
df.query('line_race != 0')
was abhängig von Ihrem Problem viel schneller ist. Sehr empfehlenswert.quelle
DataFrame
Variablennamen wie mich haben (und ich wage zu raten, jeder im Vergleich zu dendf
Beispielen), weil Sie ihn nur einmal schreiben müssen.Obwohl die vorherige Antwort fast ähnlich ist wie die, die ich tun werde, erfordert die Verwendung der Indexmethode keine andere Indexierungsmethode .loc (). Dies kann auf ähnliche, aber präzise Weise erfolgen wie
quelle
Ein anderer Weg, es zu tun. Möglicherweise nicht die effizienteste Methode, da der Code etwas komplexer aussieht als der in anderen Antworten erwähnte Code, aber dennoch eine alternative Methode, um dasselbe zu tun.
quelle
Fügen Sie einfach eine weitere Möglichkeit für DataFrame hinzu, die über alle Spalten erweitert wurde:
Beispiel:
quelle