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
J'ai besoin de supprimer les lignes où line_race
est égal à 0
. Quelle est la manière la plus efficace de procéder?
Réponses:
Si je comprends bien, cela devrait être aussi simple que:
la source
df
est volumineux? Ou puis-je le faire sur place?df
2M de lignes et c'est allé assez vite.df = df[df['line race'] != 0]
df=df[~df['DATE'].isin(['2015-10-30.1', '2015-11-30.1', '2015-12-31.1'])]
Mais pour tout futur contourneur, vous pourriez mentionner que
df = df[df.line_race != 0]
cela ne fait rien lorsque vous essayez de filtrerNone
les valeurs / manquantes.Fonctionne:
Ne fait rien:
Fonctionne:
la source
df = df[df.columns[2].notnull()]
, mais d'une manière ou d'une autre, vous devez pouvoir indexer la colonne d'une manière ou d'une autre.df = df[df.line_race != 0]
supprime les lignes mais ne réinitialise pas non plus l'index. Ainsi, lorsque vous ajoutez une autre ligne dans le df, elle peut ne pas s'ajouter à la fin. Je recommanderais de réinitialiser l'index après cette opération (df = df.reset_index(drop=True)
)==
opérateur pour commencer. stackoverflow.com/questions/3257919/…La meilleure façon de le faire est avec le masquage booléen:
MISE À JOUR: Maintenant que pandas 0.13 est sorti, une autre façon de le faire est
df.query('line_race != 0')
.la source
query
. Il permet des critères de sélection plus riches (par exemple, des opérations de type ensemble commedf.query('variable in var_list')
où 'var_list' est une liste de valeurs souhaitées)query
n'est pas très utile si le nom de la colonne contient un espace.df = df.rename(columns=lambda x: x.strip().replace(' ','_'))
juste pour ajouter une autre solution, particulièrement utile si vous utilisez les nouveaux évaluateurs de pandas, d'autres solutions remplaceront les pandas originaux et perdront les évaluateurs
la source
.reset_index()
aussi si quelqu'un finit par utiliser des accesseurs d'indexSi vous souhaitez supprimer des lignes en fonction de plusieurs valeurs de la colonne, vous pouvez utiliser:
Pour supprimer toutes les lignes avec les valeurs 0 et 10 pour
line_race
.la source
drop = [0, 10]
quelque chose commedf[(df.line_race != drop)]
La réponse donnée est néanmoins correcte car quelqu'un ci-dessus a dit que vous pouvez utiliser
df.query('line_race != 0')
ce qui, en fonction de votre problème, est beaucoup plus rapide. Recommande fortement.la source
DataFrame
des noms de variable longs comme moi (et, j'ose le deviner, tout le monde par rapport à celuidf
utilisé pour les exemples), car vous ne devez l'écrire qu'une seule fois.Bien que la réponse précédente soit presque similaire à ce que je vais faire, mais 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 d'une manière similaire mais précise
la source
Une autre façon de le faire. Peut-être pas le moyen le plus efficace car le code semble un peu plus complexe que le code mentionné dans d'autres réponses, mais toujours une manière alternative de faire la même chose.
la source
J'ai compilé et exécuté mon code. C'est un code précis. Vous pouvez l'essayer vous-même.
Si vous avez un caractère spécial ou un espace dans le nom de la colonne, vous pouvez l'écrire
''
comme dans le code donné:S'il n'y a qu'un seul nom de colonne de chaîne sans espace ni caractère spécial, vous pouvez y accéder directement.
la source
Il suffit d'ajouter une autre façon pour DataFrame développé sur toutes les colonnes:
Exemple:
la source