如何在Python中将多类过滤操作的重复函数合并为单个函数
优化方案:用配置化+分组过滤合并重复函数
核心思路
把硬编码的过滤规则、分组列做配置化管理,先筛选出符合条件的数据,再通过groupby批量处理,彻底消除重复代码和冗余的合法性检查。
步骤1:统一配置过滤规则
将所有可选过滤列的允许值集中维护,避免分散硬编码:
# 配置所有可选过滤列的允许值,按需补充另外两个列的规则 FILTER_RULES = { "Country": ["USA", "UK"], "Kind": ["A", "B"], # "Type": ["X", "Y"], # 示例:新增过滤列的规则 # "Region": ["North", "South"] }
步骤2:实现通用处理函数
这个函数接收分组列列表,自动完成数据筛选→分组处理→结果存储全流程:
import pandas as pd def process_data(df, group_columns=None): group_columns = group_columns or [] # 1. 先筛选出符合过滤规则的数据 filtered_df = df.copy() for col, allowed_values in FILTER_RULES.items(): if col in group_columns: filtered_df = filtered_df[filtered_df[col].isin(allowed_values)] # 2. 处理无分组的全量数据 if not group_columns: results = operation(filtered_df) # 所有过滤列默认填充"-" store_kwargs = {col: "-" for col in FILTER_RULES.keys()} store_results(results, **store_kwargs) return # 3. 按指定列分组处理 for group_keys, group_df in filtered_df.groupby(group_columns): # 兼容单个分组列的情况,确保键为元组格式 group_keys = (group_keys,) if not isinstance(group_keys, tuple) else group_keys # 生成当前分组的参数 store_kwargs = dict(zip(group_columns, group_keys)) # 未参与分组的列填充"-" for col in FILTER_RULES.keys(): if col not in store_kwargs: store_kwargs[col] = "-" # 执行操作并存储结果 results = operation(group_df) store_results(results, **store_kwargs)
步骤3:替代原有8个函数
原来的不同层级函数,现在只需调用通用函数并传入对应分组列即可:
# 替代operation_at_country_kind_level process_data(df, group_columns=["Country", "Kind"]) # 替代operation_at_country_level process_data(df, group_columns=["Country"]) # 替代无过滤的函数 process_data(df) # 其他分组组合示例(比如按Kind+Type) process_data(df, group_columns=["Kind", "Type"])
优势说明
- 消除冗余检查:先通过
isin筛选合法数据,groupby后无需再校验分组值合法性 - 配置化易维护:过滤规则集中管理,修改允许值或新增列只需调整
FILTER_RULES - 参数自动生成:通过字典推导自动拼接
store_results的参数,无需手动硬编码 - 扩展性强:新增分组组合时,无需修改函数逻辑,仅需调整调用参数
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

