Vérifiez si une valeur existe dans l'index pandas dataframe

139

Je suis sûr qu'il existe un moyen évident de le faire, mais je ne peux pas penser à quelque chose de lisse pour le moment.

Fondamentalement, au lieu de lever une exception, je voudrais obtenir Trueou Falsevoir si une valeur existe dans l' dfindex pandas .

import pandas as pd
df = pd.DataFrame({'test':[1,2,3,4]}, index=['a','b','c','d'])
df.loc['g']  # (should give False)

Ce que je travaille maintenant est le suivant

sum(df.index == 'g')
Abhi
la source
1
Qu'en est-il de tout (df.index == 'g')?
luffe

Réponses:

252

Cela devrait faire l'affaire

'g' in df.index
Guillaume Jacquenot
la source
7
Cela ne semble pas fonctionner lorsque plusieurs entrées partagent les mêmes valeurs d'index.
MaximG
2
@MaximG Que voulez-vous dire? Cela fonctionne également pour un index non unique.
joris
Fonctionne également pour multi-index. Si votre index a une longueur n, alors un tuple de n'importe quelle longueur de 1..npeut être vérifié
Minh Triet
2
Pour les autres qui viennent ici, vous devrez peut-être utiliser 'g' in df.columnssi votre dataframe a été défini avec des en-têtes de colonne plutôt qu'un index, par exemple:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor
2
Est-ce un temps constant ou linéaire?
Lokesh
36

Juste pour référence car c'était quelque chose que je cherchais, vous pouvez tester la présence dans les valeurs ou l'index en ajoutant la méthode ".values", par exemple

g in df.<your selected field>.values
g in df.index.values

Je trouve que l'ajout de ".values" pour obtenir une simple liste ou ndarray permet d'exister ou de vérifier "in" plus facilement avec les autres outils python. Je pensais juste que je lancerais ça pour les gens.

Ézéchiel Kruglick
la source
mais AttributeError: l'objet 'DataFrame' n'a pas d'attribut 'field'
Gank
1
Salut Gank. Le "champ" était censé montrer que vous pouvez appliquer la méthode ".values" à divers champs de la trame de données tels que des colonnes ou une colonne sélectionnée. ".index" est un exemple de remplacement de "field" par un champ réel disponible :) Je suppose que cela pourrait être plus clair ...
Ezekiel Kruglick
2
C'était vraiment utile de le souligner. J'ai un cas hiérarchique où in g in df.indexproduit vrai et in g in df.index.valuesfaux. Intéressant.
watsonic
@watsonic - un point d'avertissement est de voir si l'un de ceux-ci renvoie des tuples en raison de la hiérarchie. Assurez-vous de regarder ce que les deux publient (par exemple en ipython ou en ligne de commande) pour vous assurer de bien comprendre ce à quoi vous comparez. Une autre chose que vous pouvez faire avec les index hiérarchiques est df.index.get_level_values ​​(<nom du niveau>) pour rendre les choses plus compréhensibles - en fonction de votre application bien sûr.
Ezekiel Kruglick
28

L'index multiple fonctionne un peu différemment d'un index unique. Voici quelques méthodes pour le dataframe multi-indexé.

df = pd.DataFrame({'col1': ['a', 'b','c', 'd'], 'col2': ['X','X','Y', 'Y'], 'col3': [1, 2, 3, 4]}, columns=['col1', 'col2', 'col3'])
df = df.set_index(['col1', 'col2'])

in df.index fonctionne pour le premier niveau uniquement lors de la vérification de la valeur d'index unique.

'a' in df.index     # True
'X' in df.index     # False

Vérifiez les df.index.levelsautres niveaux.

'a' in df.index.levels[0] # True
'X' in df.index.levels[1] # True

Recherchez df.indexun tuple de combinaison d'index.

('a', 'X') in df.index  # True
('a', 'Y') in df.index  # False
brocoli2000
la source
2

avec DataFrame: df_data

>>> df_data
  id   name  value
0  a  ampha      1
1  b   beta      2
2  c     ce      3

J'ai essayé:

>>> getattr(df_data, 'value').isin([1]).any()
True
>>> getattr(df_data, 'value').isin(['1']).any()
True

mais:

>>> 1 in getattr(df_data, 'value')
True
>>> '1' in getattr(df_data, 'value')
False

Tellement amusant: D

Quoc Chi
la source
isinne vérifiera pas le dtype. df['value'].isin([True]).any()essayez ceci, cela vous donnera également Vrai, car il correspond avec 1. True -> 1.
Mohamed Thasin ah
1
df = pandas.DataFrame({'g':[1]}, index=['isStop'])

#df.loc['g']

if 'g' in df.index:
    print("find g")

if 'isStop' in df.index:
    print("find a") 
Gank
la source
Qu'est-ce que isStop?
Nabin le
1

Le code ci-dessous n'imprime pas le booléen, mais permet un sous-ensemble de trame de données par index ... Je comprends que ce n'est probablement pas le moyen le plus efficace de résoudre le problème, mais j'aime (1) la façon dont cela se lit et (2) vous pouvez facilement sous-ensemble où l'index df1 existe dans df2:

df3 = df1[df1.index.isin(df2.index)]

ou où l'indice df1 n'existe pas dans df2 ...

df3 = df1[~df1.index.isin(df2.index)]
xxyjoel
la source