如何将R语言宽格式数据框转换为指定分组汇总格式?
问题描述
现有如下宽格式DataFrame:
Factors Group n Average Max Min Calcium Above 1599 0.412 42.872 0.017 Calcium Below 1040 0.011 0.017 -0.01 Lead Above 1345 1.312 0.043 0.037 Lead Below 882 0.614 64.65 0.065
需要将其重塑为包含百分比的分组汇总格式,目标样式如下:
Group Factor Above Below Calcium n 1599(60.5%) 1040(39.4%) Average 0.412 0.011 Max,Min 42.872,0.017 0.017,-0.01 Lead n 1345(60.4%) 882(39.6%) Average 1.312 0.614 Max,Min 0.043,0.037 64.65, 0.065
解决方案
使用Python的pandas库可实现该需求,具体步骤及代码如下:
- 计算每个
Factor的总样本量,用于生成占比百分比 - 给
n列添加对应百分比后缀 - 合并
Max与Min列为Max,Min格式 - 重塑表格结构,调整索引层级匹配目标格式
import pandas as pd # 构建原始DataFrame df = pd.DataFrame({ 'Factors': ['Calcium', 'Calcium', 'Lead', 'Lead'], 'Group': ['Above', 'Below', 'Above', 'Below'], 'n': [1599, 1040, 1345, 882], 'Average': [0.412, 0.011, 1.312, 0.614], 'Max': [42.872, 0.017, 0.043, 64.65], 'Min': [0.017, -0.01, 0.037, 0.065] }) # 计算每个Factor的总样本量 factor_totals = df.groupby('Factors')['n'].transform('sum') # 为n列添加百分比(保留1位小数) df['n'] = df.apply(lambda row: f"{row['n']}({(row['n']/factor_totals[row.name]*100):.1f}%)", axis=1) # 合并Max和Min列 df['Max,Min'] = df.apply(lambda row: f"{row['Max']},{row['Min']}", axis=1) # 重塑表格结构 result = df.pivot(index='Factors', columns='Group', values=['n', 'Average', 'Max,Min']) # 调整索引层级 result = result.stack(level=0).unstack(level=1) # 设置索引和列的名称 result.index = result.index.set_names(['Factor', '']) result.columns = result.columns.set_names(['Group']) print(result)
运行代码后即可得到与目标格式一致的结果,可根据需求调整小数位数或字符串拼接规则。
内容的提问来源于stack exchange,提问作者Sundown Brownbear
相关产品推荐
相关产品推荐

