web-dev-qa-db-fra.com

Suppression de la ligne DataFrame dans Pandas en fonction de la valeur de la colonne

J'ai le DataFrame suivant:

             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

Je dois supprimer les lignes où line_race est égal à 0. Quel est le moyen le plus efficace de le faire?

406
TravisVOX

Si je comprends bien, cela devrait être aussi simple que:

df = df[df.line_race != 0]
710
tshauck

Mais pour tous les futurs passants, vous pouvez mentionner que df = df[df.line_race != 0] ne fait rien lorsque vous essayez de filtrer None/valeurs manquantes.

Ça marche:

df = df[df.line_race != 0]

Ne fait rien:

df = df[df.line_race != None]

Ça marche:

df = df[df.line_race.notnull()]
158
wonderkid2

La meilleure façon de faire est d'utiliser le masquage booléen:

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

PDATE: Maintenant que pandas 0.13 est sorti, une autre façon de le faire est df.query('line_race != 0').

39
Phillip Cloud

juste pour ajouter une autre solution, particulièrement utile si vous utilisez les nouveaux pandas assesseurs, d’autres solutions remplaceront l’original pandas et perdraient les assesseurs.

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

La réponse donnée est correcte, mais comme vous l'avez dit plus haut, vous pouvez utiliser df.query('line_race != 0') qui, selon votre problème, est beaucoup plus rapide. Recommande fortement.

13
h3h325

Une autre façon de le faire. Ce n'est peut-être pas le moyen le plus efficace, car le code a l'air un peu plus complexe que le code mentionné dans d'autres réponses, mais reste une autre façon de faire la même chose.

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

Bien que les réponses précédentes soient presque similaires à ce que je vais faire, l’utilisation de la méthode d’indexation ne nécessite pas l’utilisation d’une autre méthode d’indexation .loc (). Cela peut être fait de manière similaire mais précise

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

Si vous souhaitez supprimer des lignes en fonction de plusieurs valeurs de la colonne, vous pouvez utiliser:

df[(df.line_race != 0) & (df.line_race != 10)]

Supprimer toutes les lignes avec les valeurs 0 et 10 pour line_race.

0
Robvh