Python Pandas: Obtenir l'indice de lignes de la colonne qui correspond à la valeur
Donné un DataFrame avec une colonne "BoolCol", nous voulons trouver les indices du DataFrame dans lequel les valeurs de "BoolCol" == True
J'ai actuellement l'itération façon de le faire, ce qui fonctionne parfaitement:
for i in range(100,3000):
if df.iloc[i]['BoolCol']== True:
print i,df.iloc[i]['BoolCol']
Mais ce n'est pas le bon panda est la façon de le faire.
Après quelques recherches, je suis actuellement en utilisant ce code:
df[df['BoolCol'] == True].index.tolist()
Ce on me donne une liste d'index, mais ils ne correspondent pas, quand je vérifie en faisant:
df.iloc[i]['BoolCol']
Le résultat est en fait Faux!!
Qui serait la bonne Pandas façon de le faire?
Vous devez vous connecter pour publier un commentaire.
df.iloc[i]
renvoie laith
ligne dedf
.i
ne fait pas référence à l'indice de l'étiquette,i
est un index basé sur 0.En revanche, l'attribut
index
rendements réels étiquettes d'index, pas numérique de ligne-indices:ou, de manière équivalente,
Vous pouvez voir la différence, très clairement, en jouant avec un DataFrame avec
un non-index par défaut qui n'est pas égal à la ligne de la position numérique:
Si vous souhaitez utiliser l'index,
ensuite, vous pouvez sélectionner les lignes à l'aide de
loc
au lieu deiloc
:Noter que
loc
peut également accepter boolean tableaux:Si vous avez un booléen tableau,
mask
, et ont besoin de valeurs d'index ordinales, vous pouvez calculer à l'aide denp.flatnonzero
:Utilisation
df.iloc
pour sélectionner les lignes par index ordinale:df.query('BoolCol')
.mask
estTrue
en utilisantnp.flatnonzero
. J'ai édité le post ci-dessus pour montrer ce que je veux dire.indices = np.flatnonzero(df[col_name] == category_name)
me fait exactement ce que le titre de la question demande, qui est étonnamment difficile à trouver sur Internet.df.index[dftest]
. Je vais éditer le post en conséquence.df.index[df.BoolCol.nonzero()[0]].tolist()
Peut être fait à l'aide de numpy où() fonction:
Si vous n'avez pas toujours besoin d'un indice pour le match, mais au cas où si vous avez besoin de:
D'abord, vous pouvez vérifier
query
lorsque la cible colonne est de typebool
(PS: à propos de la façon de l'utiliser, veuillez vérifier lien )Après on filtre l'original df par la colonne Booléenne nous pouvons choisir l'index .
Aussi les pandas ont
nonzero
, nous avons il suffit de sélectionner le position deTrue
de ligne et l'aide qu'il tranche laDataFrame
ouindex
Moyen Simple est de réinitialiser l'index du DataFrame avant la filtration:
Très orthodoxe, mais c'est rapide!