Comment déterminer si une colonne Pandas contient une valeur particulière
J'essaie de déterminer s'il y a une entrée dans une colonne de Pandas qui a une valeur particulière. J'ai essayé de le faire avec if x in df['id']
. Je pensais que cela fonctionnait, sauf quand je l'ai nourri une valeur que je savais ne pas être dans la colonne {[1] } elle retournait toujours True
. Quand je sous-ensemble à une trame de données ne contenant que des entrées correspondant à l'id manquant df[df['id'] == 43]
Il n'y a, évidemment, aucune entrée dedans. Comment déterminer si une colonne dans un cadre de données Pandas contient une valeur particulière et pourquoi mon courant méthode de travail? (FYI, j'ai le même problème quand j'utilise l'implémentation dans cette Réponse à une question similaire).
2 réponses
in
d'une Série vérifie si la valeur est dans l'index:
In [11]: s = pd.Series(list('abc'))
In [12]: s
Out[12]:
0 a
1 b
2 c
dtype: object
In [13]: 1 in s
Out[13]: True
In [14]: 'a' in s
Out[14]: False
, Une option est de voir si c'est dans unique valeurs:
In [21]: s.unique()
Out[21]: array(['a', 'b', 'c'], dtype=object)
In [22]: 'a' in s.unique()
Out[22]: True
Ou un ensemble python:
In [23]: set(s)
Out[23]: {'a', 'b', 'c'}
In [24]: 'a' in set(s)
Out[24]: True
Comme indiqué par @DSM, il peut être plus efficace (surtout si vous faites cela pour une valeur) de simplement utiliser directement sur les valeurs:
In [31]: s.values
Out[31]: array(['a', 'b', 'c'], dtype=object)
In [32]: 'a' in s.values
Out[32]: True
Vous pouvez également utiliser pandas.Série.isin bien qu'il soit un peu plus long que 'a' in s.values
:
In [2]: s = pd.Series(list('abc'))
In [3]: s
Out[3]:
0 a
1 b
2 c
dtype: object
In [3]: s.isin(['a'])
Out[3]:
0 True
1 False
2 False
dtype: bool
In [4]: s[s.isin(['a'])].empty
Out[4]: False
In [5]: s[s.isin(['z'])].empty
Out[5]: True
Mais cette approche peut être plus flexible si vous devez faire correspondre plusieurs valeurs à la fois pour un DataFrame (voir DataFrame.isin)
>>> df = DataFrame({'A': [1, 2, 3], 'B': [1, 4, 7]})
>>> df.isin({'A': [1, 3], 'B': [4, 7, 12]})
A B
0 True False # Note that B didn't match 1 here.
1 False True
2 True True