La sélection de lignes à partir d'un Dataframe basée sur les valeurs de plusieurs colonnes dans les pandas
Cette question est très liées à un autre, et je vais même utiliser l'exemple de la très utile accepté solution sur cette question. Voici l'exemple de la solution retenue (crédit à unutbu):
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
# A B C D
# 0 foo one 0 0
# 1 bar one 1 2
# 2 foo two 2 4
# 3 bar three 3 6
# 4 foo two 4 8
# 5 bar two 5 10
# 6 foo one 6 12
# 7 foo three 7 14
print(df.loc[df['A'] == 'foo'])
rendements
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14
Mais que faire si je veux sélectionner toutes les lignes qui contiennent à la fois " foo " et "un"? Ici, ce serait la ligne 0 et 6. Ma tentative c'est pour essayer de
print(df.loc[df['A'] == 'foo' and df['B'] == 'one'])
Cela ne fonctionne pas, malheureusement. Quelqu'un peut-il suggérer une façon de mettre en œuvre quelque chose comme cela? Idéalement il doit être assez générale qu'il pourrait y avoir un ensemble plus complexe de conditions en y impliquant and
et or
, bien que je n'ai pas vraiment besoin de ça pour mes fins.
df.query("A=='foo' and B=='one'")
est une autre façon
OriginalL'auteur Shane | 2015-07-31
Vous devez vous connecter pour publier un commentaire.
Il n'existe qu'un très petit changement nécessaire dans votre code: changer le
and
avec&
(et ajouter des parenthèses pour le classement correct des comparaisons):La raison pour laquelle vous devez utiliser
&
que cela permettra de faire la comparaison de l'élément de sage sur les tableaux, alors queand
s'attendre à comparer deux expressions qui sont évaluées à True ou False.De même, quand vous voulez le
or
titre de comparaison, vous pouvez utiliser|
dans ce cas.and
etor
au lieu de&&
et||
de sorte qu'il aurait à être le cas que ce que je suis en train de faire exige quelque chose qui ressemble plus à l'original de mes Matlab de la pensée. En tout cas, j'apprécie l'explication et que votre réponse travaille pour l'affectation également.OriginalL'auteur joris
Vous pouvez le faire avec de minuscules modifier dans votre code:
De sortie:
&
et index en un seul passage.Merci beaucoup pour cette de George. Alors que les deux votre réponse et celle de joris suffire pour mes fins, j'ai accepté joris réponse parce qu'il explique pourquoi
and
ne fonctionne pas et sa réponse permet l'affectation également. Encore, je vous remercie de votre suggestion et upticked en conséquence.Mon plaisir Shane. D'accord, il a expliqué votre cas et les/&. En passant, je vois cet opérande différence au premier abord trop, j'ai donc appris quelque chose de nouveau. Il est donc tout à droite, et merci pour la remontée. 🙂
Merci pour la remarque
OriginalL'auteur Geeocode