使用Pandas过滤多列数据

3

我有一个方法,接受一个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个回答

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下面的评论以获得更好的实现方法。


我认为您可以使用字典语法来处理无效标识符:<br>df = pd.DataFrame({'first one': [1, 2, 1, 1], 'second one': [1, 3, 3, 3]})<br>filter_df(df, {'first one'=1, 'second one'=2}) - Stop harming Monica

1
您可以使用以下方式。
filtered_df = df[(df[column1]=='foo') & (df[column2]=='bar')]

你可以继续使用&和圆括号语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接