Sep-26-2023, 08:06 PM
(This post was last modified: Sep-26-2023, 08:06 PM by deanhystad.)
I think your approach is all wrong. Instead of testing each column for a filter, you should make a list of filters to apply. Filtering can be done with a compact loop that loops through all the selected filters.
The example below uses a dictionary to map column names with column values.
The example below uses a dictionary to map column names with column values.
import pandas as pd from dataclasses import dataclass from random import choices # Make a dataframe for demonstrating filter. letters = list("ABCDEIOU") numbers = list(range(1, 10)) mixed = [f"{letter}{number}" for letter in letters for number in numbers] df = pd.DataFrame( { "Letters": choices(letters, k=20), "Numbers": choices(numbers, k=20), "Mixed": choices(mixed, k=20), } ) def filter(frame, filters): """Apply filters to dataframe. filters is a dictionary of column: values pairs.""" df = frame.copy() for key, value in filters.items(): df = df[df[key].isin(value)] return df print("Numbers = 7", filter(df, {"Numbers": [7]}), sep="\n") odd_abcs = {"Numbers": [1, 3, 5, 7, 9], "Letters": ["A", "B", "C"]} print("", "Odd ABC's", filter(df, odd_abcs), sep="\n") even_vowels = {} even_vowels["Numbers"] = [2, 4, 6, 8] even_vowels["Letters"] = ["A", "E", "I", "O", "U"] print("", "Even Vowels", filter(df, even_vowels), sep="\n")