使用默认不过滤的函数过滤熊猫数据框

时间:2020-05-20 15:19:26

标签: python pandas dataframe

我正在尝试创建一个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()不是正确的工具吗?如果是这样,在没有传递任何属性的情况下,如何获取所有行?

2 个答案:

答案 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