我正在尝试创建一个python函数,该函数使用函数定义中的默认属性动态过滤熊猫数据框。这个想法是,如果没有值传递给该函数,则默认值将接管(我声明为列本身),因此根本不过滤数据框。
到目前为止,我已经知道了:
import pandas as pd
def filter(df, foo="df['foo']"):
newdf = df[df['foo']==foo]
print(newdf)
data = {
'foo': ['First value', 'Second value'],
'bar': ['First value', 'Second value']
}
df = pd.DataFrame(data, columns = ['foo', 'bar'])
filter(df, 'First value')
>>> foo bar
>>>0 First value First value
因此,将值传递到过滤器实际上是可行的,但是当我运行filter(df)
以触发默认属性时,我得到一个空的数据框。如果我正确理解,Python会将"df['foo']"
解释为字符串,因此,由于foo
中没有与该字符串匹配的值,因此它将返回一个空数据框。
我读到可以使用eval()
,但是当我这样定义函数时:def filter(df, foo=eval("df['foo']")):
我得到一个NameError
并说'df' is not defined
。
如果我没看错,Python会在定义函数时而不是调用函数时评估字符串。由于尚未定义df
,因此会返回错误。
eval()
不是正确的工具吗?如果是这样,在没有传递任何属性的情况下,如何获取所有行?
答案 0 :(得分:2)
我可以给你一些建议吗?
您可以尝试以下方法:
def filter(df, foo=None):
if foo is None:
print(df)
else:
newdf = df[df['foo']==foo]
print(newdf)
此外,在创建数据集之后,您可以在函数的参数中使用partial:
def filter(df, foo):
newdf = df[df['foo']==foo]
print(newdf)
...
partial(filter, foo=eval("df['foo']"))
请记住,在使用了partial之后,您需要包括“ foo =“关键字
答案 1 :(得分:0)
这对我有用:
import pandas as pd
def filter(df, foo="df['foo']"):
newdf = df[df['foo']==eval(foo)]
print(newdf)
data = {
'foo': ['First value', 'Second value'],
'bar': ['First value', 'Second value']
}
df = pd.DataFrame(data, columns = ['foo', 'bar'])
filter(df, "'First value'")
filter(df)
的输出:
foo bar
0 First value First value
1 Second value Second value
过滤器的输出(df, "'First value'")
:
foo bar
0 First value First value