过滤多列Pandas

时间:2016-02-01 12:55:03

标签: python pandas

我有一个将pandas数据帧作为输入的方法:

def dfColumnFilter(df, columnFilter, columnName):
    ''' Returns a filtered DataFrame

    Keyword arguments: 
    df           :  DataFrame in which to apply the filter
    columnFilter :  The list of which to filter by
    columnName   :  The DataFrame column to apply the columnFilter to '''

    for column_filter in columnFilter:
        df=df[df[columnName] == column_filter]
        return df

问题是我该如何为n列做这项工作?

2 个答案:

答案 0 :(得分:3)

您可以使用*args关键字传递成对列表:

def filter_df(df, *args):
    for k, v in args:
        df = df[df[k] == v]
    return df

可以像这样使用:

df = pd.DataFrame({'a': [1, 2, 1, 1], 'b': [1, 3, 3, 3]})

>>> filter_df(df, ('a', 1), ('b', 2))
    a   b
2   1   3
3   1   3

注意

理论上,你可以使用**kwargs,这会更令人满意:

filter_df(df, a=1, b=2)

但是你只能将它用于名称有效的Python标识符的列。

修改

请参阅以下@Goyo的评论,以获得更好的实施点。

答案 1 :(得分:0)

您可以按以下方式使用

filtered_df = df[(df[column1]=='foo') & (df[column2]=='bar')]

,您可以继续执行&和括号声明。