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