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_tuples
deux 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