Python 按字典值筛选dataframe,但有时包括值,有时排除值

Python 按字典值筛选dataframe,但有时包括值,有时排除值,python,pandas,Python,Pandas,我试图用字典过滤数据帧 但是,我想将过滤器['age']视为从df中排除的值列表,而不是包含的值列表 我是否可以重写以下代码,使输出为john42 London,而不是当前的john11 Warsaw 我唯一的想法是编写两个筛选字典,一个包含值,另一个包含值,然后分别使用.isin和~isin对df进行筛选。但也许还有别的办法 import pandas as pd d = { 'name': ['john', 'mike', 'john', 'tim'], 'age': [4

我试图用字典过滤数据帧

但是,我想将
过滤器['age']
视为从df中排除的值列表,而不是包含的值列表

我是否可以重写以下代码,使输出为
john42 London
,而不是当前的
john11 Warsaw

我唯一的想法是编写两个筛选字典,一个包含值,另一个包含值,然后分别使用
.isin
~isin
对df进行筛选。但也许还有别的办法

import pandas as pd

d = {
    'name': ['john', 'mike', 'john', 'tim'],
    'age': [42, 24, 11, 66],
    'city': ['London', 'Tokyo', 'Warsaw', 'New York'],
}

filters = {
    'name': ['john', 'mike'],
    'age': [66, 11, 24], # I want these to be excluded. So that age 66 and 11 are not included in the filtered df
    'city': ['Warsaw', 'London', 'Tokyo'],
}

def get_filtered_df(df, filters):
    for filter_name, filter_value in filters.items():
        mask = df[filter_name].isin(filter_value)
        df = df[mask]
    return df

df = pd.DataFrame(d)
filtered_df = get_filtered_df(df, filters)
print(filtered_df)

# output is:
# name  age    city
# john   11  Warsaw 

您只需添加适当的条件来否定/反转
掩码

...

def get_filtered_df(df, filters):
    for filter_name, filter_value in filters.items():
        mask = df[filter_name].isin(filter_value)
        if filter_name == 'age':
            mask = ~mask
        df = df[mask]
    return df

df = pd.DataFrame(d)
filtered_df = get_filtered_df(df, filters)
print(filtered_df)
输出:

   name  age    city
0  john   42  London
1  mike   24   Tokyo
   name  age    city
0  john   42  London
1  mike   24   Tokyo

创建两个列表,一个包含要包含的参数,另一个包含要排除的参数。并对掩模进行相应的修改

include = ["name", "city"]
exclude = ["age"]

def get_filtered_df(df, filters, include):
    for filter_name, filter_value in filters.items():
        mask = df[filter_name].isin(filter_value)
        if filter_name not in include:
            mask = ~mask
        df = df[mask]
    return df

df = pd.DataFrame(d)
filtered_df = get_filtered_df(df, filters)
print(filtered_df)
产量如预期