2013-08-11 18 views
229

Ich habe folgenden Datenrahmen:Löschen von Datenrahmen in Reihe Pandas basierend auf Spaltenwert

   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 

I um die Zeilen entfernen müssen, wo line_race zu 0 gleich ist. Was ist der effizienteste Weg, dies zu tun?

+3

Mögliches Duplikat von [Wie lösche Zeilen von einem Pandas DataFrame basierend auf einem bedingten Ausdruck] (http://stackoverflow.com/questions/13851535/how-to-delete-rows-from-a-pandas-dataframe- based-on-a-conditional-expression) – feetwet

Antwort

428

Wenn ich richtig zu verstehen, sollte es so einfach sein wie:

df = df[df.line_race != 0] 
+11

Wird dies mehr Speicher kosten, wenn 'df' groß ist? Oder kann ich es an Ort und Stelle tun? – ziyuang

+3

Ich lief es einfach auf einem 'df' mit 2M Zeilen und es ging ziemlich schnell. – Dror

+0

Was ist, wenn line_race ein Leerzeichen enthält? Wie 'Linienrennen'? – vfxGer

30

Der beste Weg, dies mit boolean Maskierung ist zu tun:

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 
11 2006-01-13  504   0  70 0.142 9.969 
12 2006-01-02  515   0  64 0.135 8.627 
13 2005-12-06  542   0  70 0.118 8.246 
14 2005-11-29  549   0  70 0.114 7.963 
15 2005-11-22  556   0  -1 0.110 -0.110 
16 2005-11-01  577   0  -1 0.099 -0.099 
17 2005-10-20  589   0  -1 0.093 -0.093 
18 2005-09-27  612   0  -1 0.083 -0.083 
19 2005-09-07  632   0  -1 0.075 -0.075 
20 2005-06-12  719   0  69 0.049 3.360 
21 2005-05-29  733   0  -1 0.045 -0.045 
22 2005-05-02  760   0  -1 0.040 -0.040 
23 2005-04-02  790   0  -1 0.034 -0.034 
24 2005-03-13  810   0  -1 0.031 -0.031 
25 2004-11-09  934   0  -1 0.017 -0.017 

In [57]: df[df.line_race != 0] 
Out[57]: 
    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, wo Pandas 0,13 ist out, ein anderer Weg, dies zu tun ist df.query('line_race != 0').

+0

df.query sieht sehr nützlich aus! Vielen Dank! http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.query.html – fantabolous

+10

Gutes Update für 'query'. Es erlaubt reichhaltigere Auswahlkriterien (zB set-artige Operationen wie 'df.query ('Variable in var_list')' 'wobei 'var_list' eine Liste von gewünschten Werten ist) – philE

+0

Wie würde dies erreicht werden, wenn der Spaltenname a hat Platz im Namen? – iNoob

112

Aber für alle zukünftigen bypassers könnten Sie erwähnen, dass df = df[df.line_race != 0] nichts unternimmt, wenn Sie versuchen, nach None/fehlenden Werten zu filtern.

funktioniert:

df = df[df.line_race != 0] 

Hat nichts tun:

df = df[df.line_race != None] 

funktioniert:

df = df[df.line_race.notnull()] 
+1

Weiß jemand, warum das oben ist wahr? Warum nicht! = Keine (oder ist keine) funktioniert? – eamcvey

+0

Sie können Ihre eigenen Beiträge @ wonderkid12 kommentieren.Sie können die Beiträge anderer Leute nicht kommentieren. –

+0

Vielen Dank, die meine NaN-Einträge wurden nicht gelöscht! –

6

Die gegebene Antwort ist richtig nontheless wie oben jemand sagte, die Sie verwenden können df.query('line_race != 0') was je nach Problem viel schneller ist. Sehr empfehlenswert.

Verwandte Themen