Dividir el dataframe en dos y usar tilde ~ como variable

Quiero hacer 2 operaciones similares con Pandas en Python 3. Una con tilde y otra sin tilde.

1 - df = df[~(df.teste.isin(["Place"]))] 2 - df = df[(df.teste.isin(["Place"]))] 

Intenté declarar la tilde como variable, para poder escribir solo una línea y luego decidir si quiero usar con o sin tilde. Pero no funciona:

 tilde = ["~", ""] df = df[tilde[0](df.teste.isin(["Place"]))] 

¿Es posible hacer algo que pueda reducir mi código? Porque estoy escribiendo muchas líneas iguales solo cambiando la tilde …

¡Gracias!

Por qué quiero la tilde como variable:

     def server_latam(df): df.rename(columns={'Computer:OSI':'OSI'}, inplace=True) df = df[~(df.teste.isin(["Place"]))] df1 = df.loc[df.model != 'Virtual Platform', 'model'].count() print("LATAM") print("Physical Servers: ",df1) df2 = df.loc[df.model == 'Virtual Platform', 'model'].count() print("Virtual Servers: ",df2) df3 = df.groupby('platformName').size().reset_index(name='by OS: ') print(df3) def server_latam_without_tilde(df): df.rename(columns={'Computer:OSI':'OSI'}, inplace=True) df = df[(df.teste.isin(["Place"]))] df1 = df.loc[df.model != 'Virtual Platform', 'model'].count() print("LATAM") print("Physical Servers: ",df1) df2 = df.loc[df.model == 'Virtual Platform', 'model'].count() print("Virtual Servers: ",df2) df3 = df.groupby('platformName').size().reset_index(name='by OS: ') print(df3) 

    En la segunda línea de cada función aparece la tilde.

    Para su caso de uso limitado, existe un beneficio limitado en lo que está solicitando.

    Agrupar por

    Sin embargo, su problema real es la cantidad de variables que tiene que crear. Puedes reducirlos a la mitad a través de GroupBy y un mero calculado:

     df = pd.DataFrame({'teste': ['Place', 'Null', 'Something', 'Place'], 'value': [1, 2, 3, 4]}) dfs = dict(tuple(df.groupby(df['teste'] == 'Place'))) {False: teste value 1 Null 2 2 Something 3, True: teste value 0 Place 1 3 Place 4} 

    Luego acceda a sus marcos de datos a través de dfs dfs[0] y dfs[1] , ya que False == 0 y True == 1 . Hay un beneficio con este último ejemplo. Ahora eliminas la necesidad de crear nuevas variables innecesariamente . Sus marcos de datos están organizados ya que existen en el mismo diccionario.

    Despacho de funciones

    Su requisito preciso se puede cumplir a través del módulo del operator y una función de identidad:

     from operator import invert tilde = [invert, lambda x: x] mask = df.teste == 'Place' # don't repeat mask calculations unnecessarily df1 = df[tilde[0](mask)] df2 = df[tilde[1](mask)] 

    Secuencia de desembalaje

    Si su intención es usar una línea, use la secuencia de desempaquetado:

     df1, df2 = (df[func(mask)] for func in tilde) 

    Tenga en cuenta que puede replicar el resultado GroupBy través de:

     dfs = dict(enumerate(df[func(mask)] for func in tilde) 

    Pero esto es verboso y complicado. Quédate con la solución GroupBy .

    Posiblemente podría condensar un poco su código definiendo sus pruebas y luego iterándolas. Déjame ilustrar:

     tests = ["Place", "Foo", "Bar"] for t in tests: # not sure what you are doing exactly, just copied it 1 - df = df[~(df.teste.isin([t]))] 2 - df = df[(df.teste.isin([t]))] 

    De esa manera, solo tiene dos líneas que realizan el trabajo real, y simplemente agregar otra prueba a la lista le ahorra el código de duplicación. Aunque no tengo idea si esto es lo que quieres.