如何遍历品牌拆分后的DataFrame并批量执行函数生成Excel?
解决方案:按品牌循环生成专属Excel报表
嘿,我来帮你搞定这个循环实现的问题!你现在的核心需求是把大型数据集按品牌拆分,每个品牌单独生成包含多份统计表格的Excel文件对吧?咱们一步步调整你的代码:
第一步:修复函数的参数问题
你写的表格函数里用了全局变量df_cliente,但参数是df,这会导致循环时每个品牌都用同一个全局数据集,完全达不到拆分的效果。先把所有函数里的df_cliente替换成参数df:
import pandas as pd def tab_new_born(df): # 替换全局变量df_cliente为传入的参数df tab_1 = df.astype(str).groupby('definitive_class').agg({'definitive_class': lambda x: x.count()}) return tab_1 def tab_updated_and_working(df): # 替换全局变量df_cliente为传入的参数df tab_2 = pd.crosstab((df.FIRMWARE_STATUS_UPDATE == 'updated'), (df.app_trans_features == 1), margins = True) tab_2.rename(index = {False : 'no', True : 'yes', 'All' : 'Total'}, columns = {False : 'no_trans_in_7_last_days', True : 'yes_trans_in_7_last_days','All' : 'Total' }, inplace= True) return tab_2 # 假设你还有以下两个函数,同样要替换全局变量为参数df def tab_working_and_anomalous(df): # 这里填入你的原逻辑,记得用参数df而非全局变量 pass def tab_working_and_registry(df): # 这里填入你的原逻辑,记得用参数df而非全局变量 pass
第二步:构建函数与Sheet名的对应列表
把所有生成表格的函数和对应的Sheet名称配对,这样循环时可以批量处理,以后新增表格也只需要在这里加一行:
# 列表每个元素是(生成表格的函数, 对应Sheet名称)的元组 report_tasks = [ (tab_new_born, 'MHT_classification'), (tab_updated_and_working, '#VM_operative'), (tab_working_and_anomalous, '#VM_conn_problems_operative'), (tab_working_and_registry, '#VM_registry_null') ]
第三步:按品牌循环生成Excel文件
接下来就是核心的循环逻辑:先获取所有唯一品牌,然后逐个筛选数据、生成报表:
# 替换成你数据集中实际的品牌列名称,比如'brand'或'marca' brand_col = '品牌列名' # 获取数据集中所有不重复的品牌 all_brands = df[brand_col].unique() for brand in all_brands: # 1. 筛选当前品牌的专属数据集 brand_data = df[df[brand_col] == brand] # 处理品牌名中的特殊字符(避免生成Excel文件名报错) safe_brand_name = str(brand).replace('/', '_').replace(':', '_').replace('?', '_') # 生成当前品牌的Excel文件名 output_filename = f"{safe_brand_name}_output.xlsx" # 2. 创建Excel写入器 writer = pd.ExcelWriter(output_filename, engine='xlsxwriter') # 3. 循环所有报表任务,生成表格并写入对应Sheet for generate_tab, sheet_name in report_tasks: result_tab = generate_tab(brand_data) result_tab.to_excel(writer, sheet_name=sheet_name) # 4. 保存并关闭文件 writer.save() writer.close()
关键注意点
- 参数一致性:一定要确保函数使用传入的
df参数,而不是全局变量,这是拆分品牌数据的核心前提。 - 安全文件名:品牌名里的
/、:、?等特殊字符会导致Excel文件无法创建,所以先用replace替换成下划线。 - 可扩展性:以后要新增报表类型,只需要在
report_tasks列表里添加新的(函数, Sheet名)元组即可,不需要修改循环逻辑。
内容的提问来源于stack exchange,提问作者Annamaria Capursi Nappi
相关产品推荐
相关产品推荐

