我正在尝试使用三个列的阈值来过滤 pandas 数据帧
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
但我希望在一个函数内完成此操作,其中列名和它们的阈值以字典形式给出。这是我的第一次尝试,效果还不错。本质上,我将过滤器放在变量cond
内并运行它:
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
现在,我把所有东西都放到一个函数里面,结果它就无法工作了(也许 exec
函数不喜欢在函数内使用!):
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
我知道exec
函数在函数内部使用时的行为与之不同,但不确定如何解决这个问题。此外,我想知道是否有更优雅的方法来定义一个函数来过滤两个输入:1)df
和2)limits_dic = {"A":0, "B":2, "C":-1}
。非常感谢您的想法。
cond =“df2 = df.loc [”
和return(locals()[ 'df2'])
),它会起作用。 我尝试将字典添加到exec
,但无济于事。 - bobrobbobpd.eval()
函数族的更多信息,其特性和用例,请访问使用pd.eval()在pandas中进行动态表达式评估。 - cs95