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

如何用Python生成与R格式一致的聚合数据集?

解决Pandas分组聚合后分组列为索引的问题

Pandas默认会将groupby的分组列设为DataFrame索引,这和R中dplyr的行为不同。要得到和R一致的输出格式,你需要保留分组列为普通列,并调整聚合列的名称,以下是两种实现方法:

方法一:分组时指定as_index=False

直接在groupby中设置参数,让分组列保持为普通列,同时显式命名聚合结果列:

import pandas as pd

baseball_example = {
    "team": ["Red Sox", "Red Sox", "Red Sox", "Red Sox", "Red Sox", "Red Sox", "Yankees", "Yankees", "Yankees", "Yankees", "Yankees", "Yankees"],
    "pos": ["Pitcher", "Pitcher", "Pitcher", "Not Pitcher", "Not Pitcher", "Not Pitcher", "Pitcher", "Pitcher", "Pitcher", "Not Pitcher", "Not Pitcher", "Not Pitcher"],
    "age": [24, 28, 40, 22, 29, 33, 31, 26, 21, 36, 25, 31]
}

baseball_example = pd.DataFrame(baseball_example)

# as_index=False 保留分组列为普通列,agg()显式定义聚合列名
average_age_by_team_position = baseball_example.groupby(['team', 'pos'], as_index=False).agg(mean_age=('age', 'mean'))

print(average_age_by_team_position)

输出结果(与R格式一致):

team         pos   mean_age
0  Red Sox  Not Pitcher  28.000000
1  Red Sox      Pitcher  30.666667
2  Yankees  Not Pitcher  30.666667
3  Yankees      Pitcher  26.000000

方法二:聚合后重置索引

如果已经完成聚合操作,可以用reset_index()将索引中的分组列转换为普通列:

average_age_by_team_position = baseball_example.groupby(['team', 'pos']).agg(mean_age=('age', 'mean')).reset_index()

关键说明

  • as_index=False:核心参数,让Pandas不把分组列设为索引,对齐R中dplyr的分组行为。
  • 显式聚合列命名:用mean_age=('age', 'mean')替代agg("mean"),将聚合后的列名从默认的age改为mean_age,和R输出的列名匹配。
  • 后续操作:处理后的DataFrame可以直接用于分析,导出CSV时只需添加index=False即可避免导出索引列:
    average_age_by_team_position.to_csv("average_age.csv", index=False)
    

内容的提问来源于stack exchange,提问作者T PERRY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:05:18