如何按Service Model分组为多列生成自定义describe汇总表并导出CSV
问题描述
现有数据集:
d = {'eue_scanner': [1,2,3,4,5], 'eue_thinclient': [12,1221,2123,1231, 123], 'service_model': ['Gold', 'Bronze', 'Bronze', 'Silver', 'Silver']} df = pd.DataFrame(data=d)
需求:为指定列 column_for_stats = ['eue_scanner', 'eue_thinclient'] 按照 service_model 分组,生成类似单列 df['eue_thinclient'].describe().to_csv("my_description.csv") 格式的describe汇总表,包含所有分组与列的组合并导出为CSV。当前代码因存在break语句仅处理了一组一列,需要完整解决方案。
解决方案
可以利用pandas的groupby结合describe方法一次性生成所有分组和指定列的统计汇总,再导出为CSV,无需循环处理(避免break导致的不完整)。
方法1:直接生成多层索引统计结果并导出
这是最简洁的实现方式,直接覆盖所有分组与列的组合:
import pandas as pd d = {'eue_scanner': [1,2,3,4,5], 'eue_thinclient': [12,1221,2123,1231, 123], 'service_model': ['Gold', 'Bronze', 'Bronze', 'Silver', 'Silver']} df = pd.DataFrame(data=d) column_for_stats = ['eue_scanner', 'eue_thinclient'] # 按service_model分组,对指定列生成全量describe统计 grouped_describe = df.groupby('service_model')[column_for_stats].describe() # 导出为CSV,保留多层索引结构 grouped_describe.to_csv("grouped_description.csv")
补充:扁平化表头(可选)
如果觉得多层表头不够直观,可以将其扁平化,生成类似eue_scanner_count、eue_thinclient_mean的表头格式:
# 扁平化多层表头 grouped_describe.columns = ['_'.join(col).strip() for col in grouped_describe.columns.values] # 重新导出 grouped_describe.to_csv("grouped_description_flat.csv")
方法2:手动遍历所有分组与列(无break)
如果需要更灵活地控制每一组每一列的处理逻辑,可以去掉break语句,遍历所有组合并汇总结果:
import pandas as pd d = {'eue_scanner': [1,2,3,4,5], 'eue_thinclient': [12,1221,2123,1231, 123], 'service_model': ['Gold', 'Bronze', 'Bronze', 'Silver', 'Silver']} df = pd.DataFrame(data=d) column_for_stats = ['eue_scanner', 'eue_thinclient'] # 创建空DataFrame存储所有结果 all_results = pd.DataFrame() # 遍历每个分组 for group_name, group_data in df.groupby('service_model'): # 遍历每个指定列 for col in column_for_stats: # 生成当前列的describe结果 desc = group_data[col].describe() # 添加分组和列名标识 desc = desc.reset_index() desc['service_model'] = group_name desc['column'] = col # 合并到总结果 all_results = pd.concat([all_results, desc], ignore_index=True) # 调整列顺序并导出 all_results = all_results[['service_model', 'column', 'index', 0]] all_results.columns = ['service_model', 'column', 'statistic', 'value'] all_results.to_csv("grouped_description_detailed.csv", index=False)
这种方式会生成每行对应一个「分组-列-统计指标」的结构,适合需要细粒度数据的场景。
内容的提问来源于stack exchange,提问作者Wolfy
相关产品推荐
相关产品推荐

