数据合并——合并汇总统计量和原始数据

摘自《The Little SAS Book》

生成原始数据集——shoes,并排序: 

DATA shoes;
	INPUT style $ 1-15 exercisetype $ sales;
	DATALINES;
Max Flight      running 1930
Zip Fit Leather walking 2250
Zoom Airborne   running 4150
Light Step      walking 1130
Max Step Woven  walking 2230
Zip Sneak       c-train 1190
;
RUN;
PROC SORT data=shoes;
    BY exercisetype;
RUN;

shoes数据集:

 

生成该数据集的汇总统计量,并写入数据集----summarydata:

PROC MEANS NOPTINT DATA=shoes;
	VAR sales;
	BY exercisetype;
	OUTPUT OUT=summarydata SUM(sales) = total;
RUN;

summarydata数据集: 

 

 合并shoes数据集和summarydata数据集:

DATA shoesummary;
	MERGE shoes summarydata;
	BY exercisetype;
	percent = sales/total*100;
RUN;

打印:

PROC PRINT DATA = shoesummary;
	BY exercisetype;
	ID exercisetype;
	VAR style sales total percent;
	TITLE 'sales share by type of exercise';
RUN;

 

### 使用 `groupby` 合并特定列的数据 当需要基于某些条件对数据框中的特定列执行操作时,`pandas` 提供了多种方法来实现这一目标。对于合并或组合特定列的数据而言,通常会涉及到使用 `groupby()` 方法配合其他函数一起工作。 #### 利用 `agg` 函数进行自定义聚合 如果目的是计算每组内某几列的不同汇总统计量,则可以通过传递字典给 `.agg()` 来指定不同列应用不同的聚合逻辑[^2]: ```python import pandas as pd import numpy as np df1 = pd.DataFrame({ 'key': ['a', 'b', 'a', 'b'], 'data1': np.random.rand(4), 'data2': np.random.rand(4) }) result = df1.groupby('key').agg({'data1': sum, 'data2': [np.median, max]}) print(result) ``` 这段代码展示了如何针对两列分别求以及获取中位数与最大值的操作。 #### 自定义聚合函数的应用 除了内置的聚合功能外,还可以通过编写匿名函数(lambda 表达式)来自定义更复杂的聚合行为。下面的例子说明了怎样找到各组内的极差——即最大值减去最小值的结果[^3]: ```python custom_agg_result = df1.groupby('key')[['data1', 'data2']].agg( lambda arr: arr.max() - arr.min() ) print(custom_agg_result) ``` 此段脚本实现了按 `'key'` 分类后,对 `'data1'` `'data2'` 进行极差分析的任务。 #### 结合 `transform` 实现非聚合型转换 有时可能希望保留原始 DataFrame 的结构而不改变其形状,在这种情况下可以考虑采用 `transform` 方法。它允许我们为每一行添加新的字段作为该行所属分组的一个属性值,而不是返回一个新的、经过压缩后的表单[^4]。 ```python transformation_example = df1.copy() def range_diff(group): return group.max() - group.min() transformation_example['range'] = transformation_example.groupby('key')['data1'].transform(range_diff) print(transformation_example[['key', 'data1', 'range']]) ``` 上述例子中,新创建的一列 `'range'` 记录着对应于原记录所在分类下的数值范围差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miya_o00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值