如何在SAS中按ID和Type合并多行并满足附加计算条件
按ID和Type聚合数据集的实现方案
SAS、Python(Pandas)等工具都能轻松实现这类分组聚合需求,以下是可批量复用的代码示例:
SAS 实现
单数据集处理
用PROC SQL直接完成分组求和与加权平均计算:
PROC SQL; CREATE TABLE aggregated_data AS SELECT ID, Type, SUM(Length) AS Total_Length, SUM(Length * Value) / SUM(Length) AS Weighted_Avg_Value FROM original_data GROUP BY ID, Type; QUIT;
批量处理多数据集
通过宏定义实现批量处理,只需传入待处理的数据集列表即可:
%MACRO aggregate_ds(ds_list); %DO i = 1 %TO %sysfunc(countw(&ds_list.)); %LET ds = %scan(&ds_list., &i.); PROC SQL; CREATE TABLE &ds._agg AS SELECT ID, Type, SUM(Length) AS Total_Length, SUM(Length * Value) / SUM(Length) AS Weighted_Avg_Value FROM &ds. GROUP BY ID, Type; QUIT; %END; %MEND; /* 调用示例:处理数据集A、B、C */ %aggregate_ds(A B C);
Python Pandas 实现
单数据集处理
利用groupby结合自定义聚合函数完成计算:
import pandas as pd # 读取原始数据(支持csv、excel等格式) df = pd.read_csv("original_data.csv") # 分组聚合 agg_df = df.groupby(['ID', 'Type']).agg( Total_Length=('Length', 'sum'), Weighted_Avg_Value=('Value', lambda x: (x * df.loc[x.index, 'Length']).sum() / df.loc[x.index, 'Length'].sum()) ).reset_index() # 保存结果 agg_df.to_csv("aggregated_data.csv", index=False)
批量处理多文件
遍历指定目录下的所有数据文件,自动完成聚合并输出结果:
import pandas as pd import os # 配置输入输出目录 input_dir = "./input_datasets/" output_dir = "./aggregated_results/" os.makedirs(output_dir, exist_ok=True) # 批量处理所有csv文件 for filename in os.listdir(input_dir): if filename.endswith(".csv"): file_path = os.path.join(input_dir, filename) df = pd.read_csv(file_path) # 执行聚合 agg_df = df.groupby(['ID', 'Type']).agg( Total_Length=('Length', 'sum'), Weighted_Avg_Value=('Value', lambda x: (x * df.loc[x.index, 'Length']).sum() / df.loc[x.index, 'Length'].sum()) ).reset_index() # 保存结果文件 output_filename = f"{os.path.splitext(filename)[0]}_agg.csv" agg_df.to_csv(os.path.join(output_dir, output_filename), index=False)
内容的提问来源于stack exchange,提问作者Larissa Wang
相关产品推荐
相关产品推荐

