J'essaie de déterminer s'il y a une entrée dans une colonne Pandas qui a une valeur particulière. J'ai essayé de faire ça avec if x in df['id']
. Je pensais que cela fonctionnait, sauf lorsque je lui ai donné une valeur dont je savais qu'elle ne figurait pas dans la colonne, 43 in df['id']
elle retournait toujours True
. Lorsque je sous-ensemble à une trame de données contenant uniquement des entrées correspondant à l'identifiant manquant, df[df['id'] == 43]
il n'y a, évidemment, aucune entrée. Comment déterminer si une colonne dans un bloc de données Pandas contient une valeur particulière et pourquoi ma méthode actuelle ne fonctionne-t-elle pas? (Pour info, j'ai le même problème lorsque j'utilise l'implémentation dans cette réponse à une question similaire).
157
'a' in s.values
devrait être plus rapide pour les longues séries.'a' in s
, les pandas choisissent de vérifier l'index plutôt que les valeurs de la série? Dans les dictionnaires, ils vérifient les clés, mais une série de pandas devrait se comporter davantage comme une liste ou un tableau, non?s.values
etdf.values
est fortement déconseillé. Regarde ça . En outre, ils.values
est en fait beaucoup plus lent dans certains cas..to_numpy
ou.array
sont disponibles sur une série, donc je ne suis pas entièrement sûr de l'alternative qu'ils préconisent (je ne lis pas "fortement découragé"). En fait, ils disent que .values peut ne pas renvoyer un tableau numpy, par exemple dans le cas d'un catégorique ... mais c'est très bien carin
cela fonctionnera toujours comme prévu (en fait plus efficacement que son homologue de tableau numpy)Vous pouvez également utiliser pandas.Series.isin bien qu'il soit un peu plus long que
'a' in s.values
:Mais cette approche peut être plus flexible si vous devez faire correspondre plusieurs valeurs à la fois pour un DataFrame (voir DataFrame.isin )
la source
s.isin(['a']).any()
le
found.count()
testament contient le nombre de correspondancesEt s'il vaut 0, cela signifie que la chaîne n'a pas été trouvée dans la colonne.
la source
na=False
etregex=False
pour mon cas d'utilisation, comme expliqué ici: pandas.pydata.org/pandas-docs/stable/reference/api/…J'ai fait quelques tests simples:
Fait intéressant, peu importe si vous recherchez 9 ou 999999, il semble que cela prenne à peu près le même temps en utilisant la syntaxe in (doit utiliser la recherche binaire)
On dirait que l'utilisation de x.values est la plus rapide, mais peut-être y a-t-il une manière plus élégante dans les pandas?
la source
Ou utilisez
Series.tolist
ouSeries.any
:Series.tolist
fait une liste de aSeries
, et de l'autre je reçois juste un booléenSeries
d'un régulierSeries
, puis vérifie s'il y a desTrue
s dans le booléenSeries
.la source
Condition simple:
la source
Utilisation
Si
x
est présent,id
il retournera la liste des index où il est présent, sinon il donnera une liste vide.la source
Je ne suggère pas d'utiliser "valeur en série", ce qui peut entraîner de nombreuses erreurs. Veuillez consulter cette réponse pour plus de détails: Utilisation en opérateur avec la série Pandas
la source
Supposons que votre dataframe ressemble à:
Vous voulez maintenant vérifier si le nom de fichier "80900026941984" est présent ou non dans le dataframe.
Vous pouvez simplement écrire:
la source