df.iloc[i]
renvoie la ith
ligne de df
. i
ne fait pas référence à l'étiquette d'index, i
est un index basé sur 0.
En revanche, l'attribut index
renvoie des étiquettes d'index réelles , pas des index de ligne numériques:
df.index[df['BoolCol'] == True].tolist()
ou équivalent,
df.index[df['BoolCol']].tolist()
Vous pouvez voir la différence assez clairement en jouant avec un DataFrame avec un index non par défaut qui n'est pas égal à la position numérique de la ligne:
df = pd.DataFrame({'BoolCol': [True, False, False, True, True]},
index=[10,20,30,40,50])
In [53]: df
Out[53]:
BoolCol
10 True
20 False
30 False
40 True
50 True
[5 rows x 1 columns]
In [54]: df.index[df['BoolCol']].tolist()
Out[54]: [10, 40, 50]
Si vous souhaitez utiliser l'index ,
In [56]: idx = df.index[df['BoolCol']]
In [57]: idx
Out[57]: Int64Index([10, 40, 50], dtype='int64')
alors vous pouvez sélectionner les lignes en utilisant loc
au lieu deiloc
:
In [58]: df.loc[idx]
Out[58]:
BoolCol
10 True
40 True
50 True
[3 rows x 1 columns]
Notez que loc
peut également accepter des tableaux booléens :
In [55]: df.loc[df['BoolCol']]
Out[55]:
BoolCol
10 True
40 True
50 True
[3 rows x 1 columns]
Si vous avez un tableau booléen mask
, et avez besoin de valeurs d'index ordinales, vous pouvez les calculer en utilisantnp.flatnonzero
:
In [110]: np.flatnonzero(df['BoolCol'])
Out[112]: array([0, 3, 4])
Utilisez df.iloc
pour sélectionner les lignes par index ordinal:
In [113]: df.iloc[np.flatnonzero(df['BoolCol'])]
Out[113]:
BoolCol
10 True
40 True
50 True
df.query('BoolCol')
.mask
trouve leTrue
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 donne exactement ce que demande le titre de la question, ce qui est étonnamment difficile à trouver sur Internet.Peut être fait en utilisant la fonction numpy where ():
Bien que vous n'ayez pas toujours besoin d'index pour une correspondance, mais au cas où vous en auriez besoin:
la source
Un moyen simple consiste à réinitialiser l'index du DataFrame avant le filtrage:
Un peu hacky, mais c'est rapide!
la source
Vous pouvez d'abord vérifier
query
quand la colonne cible est de typebool
(PS: sur la façon de l'utiliser, veuillez vérifier le lien )Après avoir filtré le df d'origine par la colonne booléenne, nous pouvons choisir l'index.
Aussi pandas géants ont
nonzero
, nous vous suffit de sélectionner la position de de laTrue
ligne et l' utiliser tranche laDataFrame
ouindex
la source
Si vous ne souhaitez utiliser votre objet de trame de données qu'une seule fois, utilisez:
la source
J'étendu cette question est de savoir comment se le
row
,column
etvalue
de toute valeur des matchs?voici la solution:
Production:
la source