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

Series.groupby与DataFrame.groupby的等效语法及Series按值分组统计的实现方法

解答:Series按值分组的groupby操作技巧

当然可以直接用Series.groupby()实现你要的统计!而且方法比你尝试的两种方式更直接,下面一步步给你拆解:

一、直接用Series.groupby实现按值计数

你要的Series.groupby(?????).count()的正确语法是:

ser.groupby(ser).count()

执行后会输出和你方式二结构一致的结果:

foo
aa    1
bb    1
ff    2
Name: foo, dtype: int64

二、DataFrame.groupby(column)与Series.groupby的等效关系

对于DataFrame,df.groupby('col')是按指定列的取值分组;对应到Series上,按自身值分组的等效写法就是ser.groupby(ser)——把Series本身作为groupby的参数,就相当于告诉pandas:按这个Series的取值来划分分组。

如果你的Series没有设置名称,也可以用ser.groupby(ser.values),效果完全一致,但ser.groupby(ser)能保留原Series的名称作为分组索引的名称,可读性更强。

三、实现复杂需求:获取每个分组的索引集合

你已经写出的ser.groupby(ser).apply(lambda df: set(df.index))是完全可行的,这里再给你一个更简洁的等效写法(用agg替代apply,逻辑更清晰):

ser.groupby(ser).agg(lambda x: set(x.index))

执行后同样会得到你想要的结果:

foo
aa    {a}
bb    {b}
ff    {c, d}
Name: foo, dtype: object

如果需要列表格式而非集合,只需要把set()换成list()即可,非常灵活。

额外小技巧:更快捷的按值计数方法

其实pandas还提供了专门的value_counts()方法,一行就能实现按值计数:

ser.value_counts()

输出结果为:

ff    2
aa    1
bb    1
Name: foo, dtype: int64

如果需要和groupby结果一致的排序顺序,加上sort=False参数即可:

ser.value_counts(sort=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:34:10