Mientras uso pandas, me encuentro especificando inplace = True en muchas llamadas a funciones. Utilizo mucho más que el valor predeterminado, que tiende a ser inplace = False donde sea que se defina, por convención.

¿Hay alguna manera de especificar alguna variable (quizás global) como

inplace = True

¿y luego hacer algo que hará que esa variable se pase automáticamente a cualquier función de pandas que tenga un argumento de palabra clave 'in situ', eliminando la necesidad de escribirla cada vez?

Concretamente, una solución ideal haría

df.set_index(['id', 'year'])

Equivalente a

df.set_index(['id', 'year'], inplace=True)

Y de manera similar para cualquier función de pandas que tome un argumento 'in situ'.

Esto parece una pregunta general de Python, pero mi contexto actual es pandas. No encontré ninguna otra pregunta sobre el tema de la anulación por parte del usuario de los valores de argumento predeterminados (excepto definiendo algún tipo de función de envoltura, que implicaría una cantidad similar de tipeo para invocar). En cuanto a intentar algo, no tengo pistas. Ya sé que solo definir una variable con ese nombre en el alcance de la llamada no asignará el valor a un argumento dentro del alcance de una función.

Estoy usando Python 3.7.6 y pandas 0.25.3, en caso de que eso importe.

1
Attila the Fun 25 jun. 2020 a las 17:45

2 respuestas

Creo que la única forma de lograr ese comportamiento es parchear el código que desea cambiar, p. Ej. si desea cambiar el comportamiento de pd.DataFrame, puede hacerlo (hay algunos inconvenientes menores aquí, como dejar de usar inplace como argumento posicional si alguna vez fue + tal vez alguien podría señalar más problemas, pero en general funciona) :

import pandas as pd
import inspect
import functools
for m in inspect.getmembers(pd.DataFrame, predicate=inspect.isfunction):
    if 'inplace' in inspect.getfullargspec(m[1]).args:
        setattr(pd.DataFrame, m[0], functools.partialmethod(m[1], inplace=True))

Con eso aún puede llamar a df.dropna(inplace=False), pero el valor predeterminado será inplace=True.

Dicho esto, le desanimaría fuertemente a que lo haga; tales cambios hacen que sea realmente difícil para otra persona leer parte aleatoria de su código: es probable que no sepan que usted hizo tal reemplazo y su código podría no tener sentido para ellos.

0
Alexander Pivovarov 25 jun. 2020 a las 15:34

Pruebe functools partial

from functools import partial
f = partial(DataFrame.set_index, inplace=True)
f(df) # should be roughly equivalent to df.det_index(in_place=True)
0
Nicolas Martinez 25 jun. 2020 a las 15:40