Filtrar dinámicamente un marco de datos de pandas
Estoy tratando de filtrar un marco de datos de pandas usando umbrales para tres columnas
import pandas as pd
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
"B" : [2, 5, 3, 2, 6],
"C" : [-5, 2, 1, 8, 2]})
df = df.loc[(df.A > 0) & (df.B > 2) & (df.C > -1)].reset_index(drop = True)
df
A B C
0 2 5 2
1 10 3 1
2 3 6 2
Sin embargo, quiero hacer esto dentro de una función donde los nombres de las columnas y sus umbrales me son dados en un diccionario. Aquí está mi primer intento que funciona bien. Básicamente estoy poniendo el filtro dentrocond
variable y simplemente ejecutarlo:
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
"B" : [2, 5, 3, 2, 6],
"C" : [-5, 2, 1, 8, 2]})
limits_dic = {"A" : 0, "B" : 2, "C" : -1}
cond = "df = df.loc["
for key in limits_dic.keys():
cond += "(df." + key + " > " + str(limits_dic[key])+ ") & "
cond = cond[:-2] + "].reset_index(drop = True)"
exec(cond)
df
A B C
0 2 5 2
1 10 3 1
2 3 6 2
Ahora, finalmente pongo todo dentro de una función y deja de funcionar (tal vezexec
¡a la función no le gusta que se use dentro de una función!):
df = pd.DataFrame({"A" : [6, 2, 10, -5, 3],
"B" : [2, 5, 3, 2, 6],
"C" : [-5, 2, 1, 8, 2]})
limits_dic = {"A" : 0, "B" : 2, "C" : -1}
def filtering(df, limits_dic):
cond = "df = df.loc["
for key in limits_dic.keys():
cond += "(df." + key + " > " + str(limits_dic[key])+ ") & "
cond = cond[:-2] + "].reset_index(drop = True)"
exec(cond)
return(df)
df = filtering(df, limits_dic)
df
A B C
0 6 2 -5
1 2 5 2
2 10 3 1
3 -5 2 8
4 3 6 2
Yo sé esoexec
La función actúa de manera diferente cuando se usa dentro de una función, pero no estaba seguro de cómo abordar el problema. Además, me pregunto si debe haber una forma más elegante de definir una función para hacer el filtrado con dos entradas: 1)df
y 2)limits_dic = {"A" : 0, "B" : 2, "C" : -1}
. Agradecería cualquier idea sobre esto.