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).

67
demandé sur Community 2014-01-24 01:41:11

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
79
répondu Andy Hayden 2014-01-23 21:56:17

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
14
répondu ffeast 2016-12-30 13:19:41