Pandas:使用df.eval和字符串变量作为条件过滤
Pandas: Using df.eval with string variables as conditional filtering
我有一个模拟数据框,其中一列创建于:
df = pd.DataFrame({'A': np.arange(1,201)})
这只是一个数据框,其中包含数字 1 到 200,有一列“A”。
我想根据
这样的条件语句过滤数据框
df[df["A"] > 20]
但是列名、布尔值 > 和值 20 必须作为字符串变量传入。因此,我相信 pandas 中的 dataframe.eval 函数应该用于此目的。
为此,我创建了一个名为 select_twenty 的函数。在这里:
def select_twenty(input_df, column_name, boolean_arg, value):
evaluated = input_df.eval(input_df[input_df[column_name] + boolean_arg + value])
return evaluated
在上面的函数中,input_df是上面的模拟数据框,column_name是所选列的名称,boolean_arg是布尔值,>,而value是值20. 最后三个参数在函数调用中作为字符串传入:
select_twenty(df, "A", ">", "20")
当我调用该函数时,它一直给我一个 UFuncTypeError。我找遍了Google,但不知道如何解决。我还没有看到 pandas 中的 eval 以这种方式完成的示例。
那么,请问有人可以帮我处理过滤器吗?谢谢
该错误与 eval 参数内部的 +
相关,因为您正尝试使用 boolean_arg
添加 DataFrame 列值。您正在寻找的是:
def select_twenty(input_df, column_name, boolean_arg, value):
evaluated = input_df[input_df.eval(column_name + boolean_arg + value)]
return evaluated
print(select_twenty(df, "A", ">", "20"))
A
20 21
21 22
22 23
23 24
24 25
.. ...
195 196
196 197
197 198
198 199
199 200
[180 rows x 1 columns]
我有一个模拟数据框,其中一列创建于:
df = pd.DataFrame({'A': np.arange(1,201)})
这只是一个数据框,其中包含数字 1 到 200,有一列“A”。 我想根据
这样的条件语句过滤数据框df[df["A"] > 20]
但是列名、布尔值 > 和值 20 必须作为字符串变量传入。因此,我相信 pandas 中的 dataframe.eval 函数应该用于此目的。 为此,我创建了一个名为 select_twenty 的函数。在这里:
def select_twenty(input_df, column_name, boolean_arg, value):
evaluated = input_df.eval(input_df[input_df[column_name] + boolean_arg + value])
return evaluated
在上面的函数中,input_df是上面的模拟数据框,column_name是所选列的名称,boolean_arg是布尔值,>,而value是值20. 最后三个参数在函数调用中作为字符串传入:
select_twenty(df, "A", ">", "20")
当我调用该函数时,它一直给我一个 UFuncTypeError。我找遍了Google,但不知道如何解决。我还没有看到 pandas 中的 eval 以这种方式完成的示例。 那么,请问有人可以帮我处理过滤器吗?谢谢
该错误与 eval 参数内部的 +
相关,因为您正尝试使用 boolean_arg
添加 DataFrame 列值。您正在寻找的是:
def select_twenty(input_df, column_name, boolean_arg, value):
evaluated = input_df[input_df.eval(column_name + boolean_arg + value)]
return evaluated
print(select_twenty(df, "A", ">", "20"))
A
20 21
21 22
22 23
23 24
24 25
.. ...
195 196
196 197
197 198
198 199
199 200
[180 rows x 1 columns]