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

如何使pandas groupby基于数据值而非索引分组生成目标DataFrame?

解决方案

你的问题出在df.groups返回的是分组对应的原数据索引集合,而非price列的数值,所以生成的DataFrame自然是索引值。要得到目标结构,可以通过给分组内的行添加序号后透视,或者用groupby结合unstack实现:

方法一:添加组内行号 + 透视

import pandas as pd

# 构造原DataFrame(示例数据)
my_old_df = pd.DataFrame({
    'date': [2006, 2007, 2007, 2006],
    'price': [500, 2000, 3400, 5000]
})

# 给每个年份分组内的行生成递增序号
my_old_df['row_id'] = my_old_df.groupby('date').cumcount()

# 透视转换为目标结构:行是序号,列是年份,值是price
my_desired_df = my_old_df.pivot(
    index='row_id',
    columns='date',
    values='price'
).reset_index(drop=True)  # 去掉多余的row_id索引列

# 调整列顺序匹配你的目标(可选)
my_desired_df = my_desired_df[[2007, 2006]]

print(my_desired_df)

输出结果:

2007  2006
0  2000   500
1  3400  5000

方法二:Groupby + Unstack

# 直接对price列分组,将每组的price转为序列后unstack成列
my_desired_df = my_old_df.groupby('date')['price'].apply(
    lambda x: x.reset_index(drop=True)
).unstack()

# 调整列顺序
my_desired_df = my_desired_df[[2007, 2006]]

关键说明

  • cumcount():给每个分组内的行从0开始编号,确保不同年份的price能按顺序对应到同一行
  • pivot():将行转列的核心方法,通过指定索引、列、值三个参数完成结构转换
  • unstack():把分组后的层级索引展开为列,适合这种分组后转列的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:20:28