Tengo un marco de datos df de la siguiente manera:
C1 C2 C3 a1 ad b1 be c1 cf Si hago df[df['C1'] == 'a1'] obtengo
C1 C2 C3 a1 ad ¿Hay alguna forma de comparar cosas para que si hago df[df['C1'] == 'what should I use here'] , obtenga todas las filas? es decir, estoy buscando una variable de comparación ficticia para que se ignore la declaración de comparación y se devuelvan todas las filas.
C1 C2 C3 a1 ad b1 be c1 cf Editar: como el código está protegido, necesito usar solo la declaración de comparación == . No puedo usar != . La variable de comparación viene a través de un bucle for y puedo insertar una variable ficticia en el bucle for si está disponible.
Este es el código original que no puedo modificar:
dfNew = [] for ii in ['a1', 'a2']: for jj in ['a', 'b']: dfNew.append(df[(df['C1'] == ii) & (df['C2'] == jj)]) Lo que estoy tratando de lograr en dfNew es también agregar valores donde si hubiera una variable ficticia en ['a1', 'a2', 'dummy'] entonces solo se realiza la otra operación de comparación. El número de columnas es cercano a 50, por lo que será imposible codificar cada par para ignorarlo en la operación condicional.
Edit2: ¿Cómo pasas el dummy dentro ['a1', 'a2', 'dummy'] ?
Dummy con una clase. Si desea una variable __eq__ Dummy verificación de igualdad) siempre devuelva True :
class Dummy: def __eq__(self, other): return TrueY ahora:
>>> df[df['C1'] == Dummy()] C1 C2 C3 0 a1 ad 1 b1 be 2 c1 cf >>> Siempre da True .
La clase Dummy devuelve True para todas las comprobaciones de igualdad.
Para la edición.
Solo haz:
['a1', 'a2', Dummy()]unittest.mock.any que ya hace esto por nosotros. El módulo unittest (módulo incorporado) ya hizo esta clase por nosotros. Podríamos usar eso también:
from unittest.mock import ANYY ahora:
>>> df[df['C1'] == ANY] C1 C2 C3 0 a1 ad 1 b1 be 2 c1 cf >>>¡También funcionaría!
El código fuente de unittest.mock.ANY es exactamente el mismo que hice:
Obtener el código fuente de ANY :
import inspect print(inspect.getsource(ANY.__class__))Producción:
class _ANY(object): "A helper object that compares equal to everything." def __eq__(self, other): return True def __ne__(self, other): return False def __repr__(self): return '<ANY>'Es lo mismo que hice yo :).
¿Por qué no esto?
df[df['C1'] == df['C1']]Eso funcionará para todos los valores excepto para NaN, porque NaN != NaN.
De hecho, debido a esa misma propiedad (quizás más precisa, definición ) de NaN, podría hacer esto (aunque el OP requería explícitamente únicamente el uso de == ):
df[df['C1'] == np.nan](Pruebo eso y, como se esperaba, se devolvieron todas las filas, incluidas las de NaN).