En mi caso tuve una serie panda donde los valores son 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)
Por lo tanto, podría usar la indexación para filtrar la serie, pero para crear el índice que necesitaba apply. Mi condición es "encontrar todas las tuplas que tengan exactamente una 'H'".
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
Admito que no es "encadenable" (es decir, observe que repito series_of_tuplesdos veces; debe almacenar cualquier serie temporal en una variable para que pueda llamar a aplicar (...) en ella).
También puede haber otros métodos (además .apply(...)) que pueden operar por elementos para producir un índice booleano.
Muchas otras respuestas (incluida la respuesta aceptada) usando las funciones encadenables como:
.compress()
.where()
.loc[]
[]
¡Estos aceptan callables (lambdas) que se aplican a la Serie , no a los valores individuales en esas series!
Por lo tanto, mi Serie de tuplas se comportó de manera extraña cuando intenté usar mi condición anterior / invocable / lambda, con cualquiera de las funciones encadenables, como .loc[]:
series_of_tuples.loc[lambda x: x.count('H')==1]
Produce el error:
KeyError: 'El nivel H debe ser el mismo que el nombre (Ninguno)'
Estaba muy confundido, pero parece estar usando la función Series.countseries_of_tuples.count(...) , que no es lo que quería.
Admito que una estructura de datos alternativa puede ser mejor:
- ¿Un tipo de datos de categoría?
- Un marco de datos (cada elemento de la tupla se convierte en una columna)
- Una serie de cadenas (simplemente concatenar las tuplas juntas):
Esto crea una serie de cadenas (es decir, concatenando la tupla; uniendo los caracteres de la tupla en una sola cadena)
series_of_tuples.apply(''.join)
Entonces puedo usar el encadenableSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1