【发布时间】:2018-02-06 02:19:36
【问题描述】:
我正在尝试使用三列的阈值过滤熊猫数据框
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无济于事 -
如需更多关于
pd.eval()系列函数、它们的特性和用例的信息,请访问Dynamic Expression Evaluation in pandas using pd.eval()。
标签: python pandas dataframe filter exec