Filtrando dinamicamente um dataframe de pandas
Estou tentando filtrar um quadro de dados do pandas usando limites para três colunas
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
No entanto, quero fazer isso dentro de uma função em que os nomes das colunas e seus limites sejam dados em um dicionário. Aqui está minha primeira tentativa que funciona bem. Basicamente, estou colocando o filtro dentrocond
variável e apenas execute-o:
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
Agora, finalmente, coloco tudo dentro de uma função e ela para de funcionar (talvezexec
A função não gosta de ser usada dentro de uma função!):
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
Eu sei dissoexec
A função age de maneira diferente quando usada dentro de uma função, mas não tinha certeza de como resolver o problema. Além disso, estou pensando que deve haver uma maneira mais elegante de definir uma função para fazer a filtragem, com duas entradas: 1)df
e 2)limits_dic = {"A" : 0, "B" : 2, "C" : -1}
. Eu apreciaria qualquer opinião sobre isso.