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

Pandas中groupby.size()后如何恢复索引?

解决Pandas groupby.size()后恢复索引的问题

嘿,这个问题其实是size()聚合函数的特性导致的——它默认返回的是Series,而不是DataFrame,这就是为什么你设置as_index=True或False看起来没区别的原因!咱们来拆解清楚,再给出解决方案:

为什么as_index对size()没用?

当你使用groupby.size()时,不管as_index参数怎么设置,它都会返回一个以分组键(这里是product_id)为索引的Series。而像max()这类聚合函数,在as_index=False时会返回DataFrame,自动把分组键转为普通列——这就是两者的核心差异所在。

两种解决方案,轻松恢复索引

方法1:用reset_index()转成DataFrame并命名计数列

这是最直接的方式,先通过size()得到Series,再用reset_index()把索引转为普通列,同时给计数结果指定列名:

# 生成结果并重置索引
result = df.groupby('product_id').size().reset_index(name='count')

# 输出结果
print(result)

得到的输出会是这样的DataFrame(符合你想要的“恢复索引”效果,product_id是普通列,索引为默认整数):

product_id  count
0        3587      1
1        3590      1
2        3680      2
3        6735      5
4        6744      1
5        6759      6

方法2:用agg()方法强制生成DataFrame

如果你想直接通过groupby得到DataFrame,可以用agg()方法,明确指定聚合逻辑和列名,这时as_index=False就会正常生效:

# 使用agg指定聚合方式,as_index=False让product_id成为普通列
result = df.groupby('product_id', as_index=False).agg(count=('order_id', 'size'))

print(result)

这个方法和方法1的输出完全一致,好处是一步到位,不需要额外的reset_index()操作。

补充说明

你给出的“期望输出”看起来可能有点笔误(比如原数据里的product_id是2103、2104,但分组后是3587等,两者对应不上),上面的方案是基于你想要把分组键product_id转为普通列、恢复默认整数索引的需求来设计的,应该正好匹配你的实际场景~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:00:12