You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多份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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:35:51