Dans mon cas, j'avais une série de panda où les valeurs sont des tuples de caractères :
Out[67]
0    (H, H, H, H)
1    (H, H, H, T)
2    (H, H, T, H)
3    (H, H, T, T)
4    (H, T, H, H)
Par conséquent, je pourrais utiliser l'indexation pour filtrer les séries, mais pour créer l'index dont j'avais besoin apply. Ma condition est "trouver tous les tuples qui ont exactement un" H "".
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
J'avoue que ce n'est pas "chaînable" , (c'est-à-dire que je le répète series_of_tuplesdeux fois; vous devez stocker toute série temporaire dans une variable pour pouvoir appeler apply (...) dessus).
Il peut également y avoir d' autres méthodes (en plus .apply(...)) qui peuvent fonctionner élément par élément pour produire un index booléen.
Beaucoup d'autres réponses (y compris la réponse acceptée) utilisant les fonctions chaînables comme:
- .compress()
- .where()
- .loc[]
- []
Ceux-ci acceptent les callables (lambdas) qui sont appliqués à la série , pas aux valeurs individuelles de ces séries!
Par conséquent, ma série de tuples s'est comportée étrangement lorsque j'ai essayé d'utiliser ma condition ci-dessus / callable / lambda, avec l'une des fonctions chaînables, comme .loc[]:
series_of_tuples.loc[lambda x: x.count('H')==1]
Produit l'erreur:
KeyError: 'Le niveau H doit être identique au nom (aucun)'
J'étais très confus, mais il semble utiliser la fonction Series.countseries_of_tuples.count(...) , ce qui n'est pas ce que je voulais.
J'admets qu'une structure de données alternative peut être meilleure:
- Un type de données Catégorie?
- Un Dataframe (chaque élément du tuple devient une colonne)
- Une série de chaînes (il suffit de concaténer les tuples ensemble):
Cela crée une série de chaînes (c'est-à-dire en concaténant le tuple; en joignant les caractères du tuple sur une seule chaîne)
series_of_tuples.apply(''.join)
Je peux donc utiliser le chaînableSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1