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
相关产品推荐
相关产品推荐

