You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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库可实现该需求,具体步骤及代码如下:

  1. 计算每个Factor的总样本量,用于生成占比百分比
  2. 给n列添加对应百分比后缀
  3. 合并Max与Min列为Max,Min格式
  4. 重塑表格结构,调整索引层级匹配目标格式
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:25:09