如何为多份DataFrame批量执行规则计算并生成成本汇总表
批量生成各门店成本汇总表的解决方案
问题背景
现有一份模拟超市销售数据的DataFrame,已按门店拆分为tesco_df、sainsburys_df、aldi_df并存入列表。已定义水果、蔬菜、柑橘类的分类规则及成本汇总函数,可生成成本汇总表。需要将这些规则与函数批量应用到各门店DataFrame,生成对应门店的成本汇总表(如cost_df_tesco),避免手动定义大量变量,此前尝试pipe和列表推导式未成功。
优化实现方案
步骤1:初始化数据并高效拆分门店
替代手动定义单个门店DataFrame的写法,用字典批量存储各门店数据,更易管理:
import pandas as pd # 初始化销售数据 list_of_customers =[ ['patrick','lemon','fruit','citrus',10,'tesco'], ['paul','lemon','fruit','citrus',20,'tesco'], ['frank','lemon','fruit','citrus',10,'tesco'], ['jim','lemon','fruit','citrus',20,'tesco'], ['wendy','watermelon','fruit','',39,'tesco'], ['greg','watermelon','fruit','',32,'sainsburys'], ['wilson','carrot','vegetable','',34,'sainsburys'], ['maree','carrot','vegetable','',22,'aldi'], ['greg','','','','','aldi'], ['wilmer','sprite','drink','',22,'aldi'], ['jed','lime','fruit','citrus',40,'tesco'], ['michael','lime','fruit','citrus',12,'aldi'], ['andrew','','','','33','aldi'], ['ahmed','lime','fruit','fruit',33,'aldi'] ] df = pd.DataFrame(list_of_customers,columns = ['customer','item','item_type','fruit_type','cost','store']) # 按门店拆分,用字典存储(键为门店名,值为对应DataFrame) store_dfs = {store: group.dropna() for store, group in df.groupby('store')}
步骤2:定义可复用的规则与汇总函数
重构规则和函数,让它们能适配单个门店的DataFrame,避免依赖全局变量:
# 定义分类规则(每个规则接收当前门店的DataFrame作为参数) def get_fruit_condition(store_df): return store_df['item_type'].isin(['fruit']) def get_vegetable_condition(store_df): return store_df['item_type'].isin(['vegetable']) def get_citrus_condition(store_df): return store_df['fruit_type'].isin(['citrus']) # 重构成本汇总函数,接收目标门店df、筛选条件、分组字段 def compute_sum_variable(store_df, condition, field): result = store_df.where(condition).dropna().groupby([field])[['cost']].sum().reset_index() result.columns = ['item','cost'] return result # 汇总规则列表,新增规则只需在此添加元组即可 agg_rules = [ (get_fruit_condition, 'item_type'), (get_vegetable_condition, 'item_type'), (get_citrus_condition, 'fruit_type') ]
步骤3:批量生成各门店成本汇总表
用字典存储所有门店的成本汇总表,避免手动命名大量变量,方便后续调用:
# 批量处理所有门店,生成对应成本汇总表 store_cost_dfs = {} for store_name, store_df in store_dfs.items(): # 对当前门店应用所有汇总规则 cost_fragments = [] for rule_func, field in agg_rules: condition = rule_func(store_df) cost_fragments.append(compute_sum_variable(store_df, condition, field)) # 合并当前门店的所有汇总结果 store_cost_dfs[f'cost_df_{store_name}'] = pd.concat(cost_fragments, ignore_index=True) # 调用示例 print("Tesco成本汇总表:") print(store_cost_dfs['cost_df_tesco']) print("\nSainsburys成本汇总表:") print(store_cost_dfs['cost_df_sainsburys']) print("\nAldi成本汇总表:") print(store_cost_dfs['cost_df_aldi'])
关键优化点
- 用字典存储门店数据和结果,避免手动定义大量变量,便于遍历和维护
- 分类规则改为函数形式,确保规则基于当前门店数据生成,而非全局数据
- 汇总函数解除对全局
df的依赖,实现真正的复用 - 规则列表的设计让新增分类逻辑更简单,只需在
agg_rules中添加元组即可
内容的提问来源于stack exchange,提问作者Patty
相关产品推荐
相关产品推荐

