基于用户JSON参数的Python多列分组统计汇总实现需求
Python实现DataFrame多参数分组统计并生成结果文件
核心思路
- 解析用户传入的JSON配置,提取分组列、待统计列、统计指标三类核心参数
- 利用pandas的
groupby+agg完成批量统计,支持多参数组合的遍历处理 - 将统计结果整理为宽表格式输出到
df_sum.csv - 同步生成统计项映射表
sum_map.csv,记录每个统计结果对应的原始列和计算指标
完整代码实现
import pandas as pd import json def generate_statistics(df, config_json): # 解析配置参数:兼容字符串/字典格式的输入 config = json.loads(config_json) if isinstance(config_json, str) else config_json group_cols = config.get("group_columns", []) metric_cols = config.get("metric_columns", []) agg_funcs = config.get("agg_functions", []) # 构建pandas聚合所需的字典结构 agg_dict = {col: agg_funcs for col in metric_cols} # 执行分组统计 grouped_result = df.groupby(group_cols).agg(agg_dict) # 整理多层列名为"原始列_统计指标"的格式 grouped_result.columns = ['_'.join(col).strip() for col in grouped_result.columns.values] df_sum = grouped_result.reset_index() # 生成统计项映射表 sum_map_records = [] for col in metric_cols: for func in agg_funcs: sum_map_records.append({ "statistic_item": f"{col}_{func}", "original_column": col, "agg_function": func }) sum_map = pd.DataFrame(sum_map_records) # 保存结果文件(utf-8-sig编码确保中文兼容) df_sum.to_csv("df_sum.csv", index=False, encoding="utf-8-sig") sum_map.to_csv("sum_map.csv", index=False, encoding="utf-8-sig") return df_sum, sum_map # 示例测试 if __name__ == "__main__": # 模拟测试数据集 test_data = { "HighSchool": ["A校", "A校", "B校", "B校", "C校"], "Height": [175, 180, 172, 178, 169], "Weight": [65, 70, 62, 68, 58] } df_test = pd.DataFrame(test_data) # 用户配置参数(可直接传入字典或JSON字符串) user_config = { "group_columns": ["HighSchool"], "metric_columns": ["Height", "Weight"], "agg_functions": ["mean", "median"] } # 执行统计并输出结果 result_df, map_df = generate_statistics(df_test, user_config) print("汇总结果表:") print(result_df) print("\n统计项映射表:") print(map_df)
代码说明
- 参数解析:自动识别配置的输入格式(字符串/字典),提取分组列、待统计列、统计指标
- 聚合逻辑:通过字典结构批量指定每个待统计列对应的计算指标,一次完成所有组合的统计
- 结果整理:将pandas默认的多层列名合并为可读性更强的"列名_指标"格式
- 映射表生成:遍历所有统计组合,记录每个统计项的来源和计算方式,方便后续数据溯源
- 文件输出:使用
utf-8-sig编码避免中文乱码问题,确保结果文件的兼容性
输出文件示例
df_sum.csv(汇总结果表):
HighSchool,Height_mean,Height_median,Weight_mean,Weight_median A校,177.5,177.5,67.5,67.5 B校,175.0,175.0,65.0,65.0 C校,169.0,169.0,58.0,58.0
sum_map.csv(统计项映射表):
statistic_item,original_column,agg_function Height_mean,Height,mean Height_median,Height,median Weight_mean,Weight,mean Weight_median,Weight,median
内容的提问来源于stack exchange,提问作者user24318
相关产品推荐
相关产品推荐

