No meu caso, tive uma série de panda onde os valores são tuplas de caracteres :
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)
Portanto, eu poderia usar a indexação para filtrar a série, mas para criar o índice de que precisava apply. Minha condição é "encontre todas as tuplas que têm exatamente um 'H'".
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
Eu admito que não é "encadeado" , (isto é, repito series_of_tuplesduas vezes; você deve armazenar qualquer série temporária em uma variável para que possa chamar apply (...) nela).
Também pode haver outros métodos (além .apply(...)) que podem operar elemento a elemento para produzir um índice booleano.
Muitas outras respostas (incluindo resposta aceita) usando as funções encadeadas como:
.compress()
.where()
.loc[]
[]
Eles aceitam chamáveis (lambdas) que são aplicados à Série , não aos valores individuais dessas séries!
Portanto, minha série de tuplas se comportou de forma estranha quando tentei usar minha condição / callable / lambda acima, com qualquer uma das funções encadeadas, como .loc[]:
series_of_tuples.loc[lambda x: x.count('H')==1]
Produz o erro:
KeyError: 'Nível H deve ser igual ao nome (Nenhum)'
Fiquei muito confuso, mas parece que está usando a função Series.countseries_of_tuples.count(...) , que não é o que eu queria.
Admito que uma estrutura de dados alternativa pode ser melhor:
- Um tipo de dados de categoria?
- Um Dataframe (cada elemento da tupla se torna uma coluna)
- Uma série de strings (apenas concatenar as tuplas):
Isso cria uma série de strings (ou seja, concatenando a tupla; juntando os caracteres na tupla em uma única string)
series_of_tuples.apply(''.join)
Então eu posso usar o encadeamentoSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1