1030 Stimmen

Löschen von DataFrame-Zeile in Pandas basierend auf dem Spaltenwert

Ich habe das folgende 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 0 ist. Was ist der effizienteste Weg, dies zu tun?

68voto

Loochie Punkte 2096

Obwohl die vorherige Antwort fast ähnlich ist wie das, was ich tun werde, erfordert die Verwendung der Index-Methode nicht die Verwendung einer anderen Index-Methode .loc(). Es kann auf ähnliche, aber präzise Weise erfolgen wie

df.drop(df.index[df['line_race'] == 0], inplace = True)

49voto

Phillip Cloud Punkte 23488

Der beste Weg, dies zu tun, ist mit dem booleschen Maskieren:

In [56]: df
Out[56]:
     line_date  daysago  line_race  rating    raw  wrating
0   2007-03-31       62         11      56  1.000   56.000
1   2007-03-10       83         11      67  1.000   67.000
2   2007-02-10      111          9      66  1.000   66.000
3   2007-01-13      139         10      83  0.881   73.096
4   2006-12-23      160         10      88  0.793   69.787
5   2006-11-09      204          9      52  0.637   33.106
6   2006-10-22      222          8      66  0.582   38.408
7   2006-09-29      245          9      70  0.519   36.318
8   2006-09-16      258         11      68  0.486   33.063
9   2006-08-30      275          8      72  0.447   32.160
10  2006-02-11      475          5      65  0.165   10.698

UPDATE: Jetzt, da pandas 0.13 veröffentlicht ist, gibt es eine weitere Möglichkeit, dies zu tun: df.query('line_race != 0').

19voto

h3h325 Punkte 751

Die gegebene Antwort ist dennoch korrekt, wie bereits jemand gesagt hat, können Sie df.query('line_race != 0') verwenden, was je nach Ihrem Problem viel schneller ist. Sehr empfehlenswert.

8voto

ashkangh Punkte 1594

Einer der effizienten und pandaicen Wege ist die Verwendung der eq()-Methode:

df[~df.line_race.eq(0)]

7voto

Amruth Lakkavaram Punkte 1477

Ein weiterer Weg, es zu tun. Mag nicht der effizienteste Weg sein, da der Code etwas komplexer aussieht als der in anderen Antworten erwähnte Code, aber dennoch eine alternative Möglichkeit, das Gleiche zu tun.

  df = df.drop(df[df['line_race']==0].index)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X