• 售前

  • 售后

热门帖子
入门百科

pandas groupby分组对象的组内排序办理方案

[复制链接]
凡尘莲花1 显示全部楼层 发表于 2021-10-26 14:06:49 |阅读模式 打印 上一主题 下一主题
题目:

根据数据某列进行分组,选择其中另一列巨细top-K的的所在行数据
解析:

求解思绪很清晰,即先用groupby对数据进行分组,然后再根据分组后的某一列进行排序,选择排序结果后的top-K结果
案例:

取一下dataframe中B列各对象中C值最高所在的行
  1. df = pd.DataFrame({"A": [2, 3, 5, 4], "B": ['a', 'b', 'b', 'a'], "C": [200801, 200902, 200704, 201003]})
复制代码
Groupby的根本功能先容
groupby以后返回DataFrameGroupBy对象,现实上还没有进行任何盘算,只是一个暂时存储的容器,
  1. [In]df.groupby('B')
  2. [Out]<pandas.core.groupby.DataFrameGroupBy object at 0x11800f588>
复制代码
对groupby结果进行简朴的列选取返回的也是DataFrameGroupBy/SeriesGroupBy对象,无法可视化
  1. [In]df.groupby('B')['A']   # 返回SeriesGroupBy对象
  2. [Out]<pandas.core.groupby.SeriesGroupBy object at 0x117f6b630>
  3. [In]df.groupby('B')['A','C']   # 返回DataFrameGroupBy对象
  4. [Out]<pandas.core.groupby.DataFrameGroupBy object at 0x117fb84e0>
复制代码
须要对DataFrameGroupBy进行计数、统计、agg聚合盘算、apply映射盘算和transform等利用,才能天生可视化的数据(下文仅以count和size函数为例展示,不涉及别的的利用)
  1. [In] df.groupby('B', as_index=False)['A'].count()  # 组内数据统计
  2. [Out] B A
  3. 0 a 2
  4. 1 b 2
  5. [In] df.groupby('B')['A'].size().reset_index(name='Size') # 组内数据统计,size和count的一个显著区别在于count不考虑Nan,size考虑Nan
  6. [Out] B Size
  7. 0  a 2
  8. 1  b 2
复制代码
解决方案一:

对DataFrameGroupBy对象,用apply函数进行某列的sort_values排序,再选出其中的最大值所在行
  1. # 返回值是一个带有multiindex的dataframe数据,其中level=0为groupby的by列,而level=1为原index
  2. [In] df.groupby('B').apply(lambda x: x.sort_values('C', ascending=False))
  3. [Out] A B C
  4. B  
  5. a 3 4 a 201003
  6. 0 2 a 200801
  7. b 1 3 b 200902
  8. 2 5 b 200704
  9. # 通过设置group_keys参数对multiindex进行优化
  10. [In] df.groupby('B', group_keys=False).apply(lambda x: x.sort_values('C', ascending=False))
  11. [Out] A B  C
  12. 3 4 a 201003
  13. 0 2 a 200801
  14. 1 3 b 200902
  15. 2 5 b 200704
  16. # 再次groupby,并调用内置的first()方法,取最大值
  17. [In] df.groupby('B', group_keys=False).apply(lambda x: x.sort_values('C', ascending=False)).groupby('B').first().reset_index()
  18. [Out]  B A  C
  19. 0 a 4 201003
  20. 1 b 3 200902
复制代码
解决方案二:

先对B进行整体的sort_values,在groupy取值
  1. [In] df.sort_values('C', ascending=False).groupby('B').first().reset_index()
  2. [Out]  B A  C
  3. 0 a 4 201003
  4. 1 b 3 200902
复制代码
题目拓展:

以上仅解决了Top-1的题目,如果是Top-k呢?
答案:将first()函数变为head()函数
  1. [In] df.sort_values('C', ascending=False).groupby('B').head(2)
  2. [Out] A B C
  3. 3 4 a 201003
  4. 1 3 b 200902
  5. 0 2 a 200801
  6. 2 5 b 200704
复制代码
总结:

1、方案二,即先排序再groupby取值更方便
2、pandas中API众多,在现实使用时要捋清各步调返回值的范例以方便影象和遐想
增补:pandas分组groupby、agg,排序sort,毗连concat、join
毗连concat和join

横向毗连
  1. pd.concat([df6,df7],axis=1)
  2. df6.join(df7)
  3. # df6的表格在前面,如需df7的表格在前需要交换位置
复制代码
注意点:
1、concat这个方法,既可以实现横向毗连,也可以实现纵向毗连,通过设置axis的值来控制,axis=1表示的是横向毗连,如果多个毗连的对象,放在列表中
2、join也可以实现
纵向毗连
  1. pd.concat([df8,df9],ignore_index=True)
复制代码
注意点:
1、进行纵向归并的数据,须要用[]集合起来
2、ignore_index忽略原有的行索引,重新分列
3、drop_duplicates()删除重复数据
排序
  1. #按照成绩排序
  2. df10.sort_values('score')
  3. #默认升序,从小到大
  4. df10.sort_values(['score','group'],ascending=False,na_position='first')
  5. #sort各个属性
复制代码
      参数      描述                  by      字符串大概列表,如果是单个排序字段,使用的是字符串,如果指定多个,须要使用列表              ascending      True的时候,是按照升序,默认是升序              na_position      表示的是空值的位置,'last'是默认的,'first'开始位置    分组
  1. ### groupby
  2. df11.groupby('class')
  3. df11.groupby(['class','grade'])
  4. for cls,data in df11.groupby(['class','grade']):
  5. print(cls)
  6. print(data)
复制代码
注意点:
1、groupby 如果指定的是一个列,如果是多个列[]
2、groupby返回的是一个对象,所以不能直接访问,可以使用for
筛选出分组之后的列

如果筛选出一列数据[[列名]],返回的是dataframe对象
如果筛选出多个列数据,直接使用[]和[[]]均可
总结[[列1,列2,。。。。]]
聚合函数 agg配合使用
  1. dff.groupby('class')[['math']].agg(['mean','max','min','median','std'])
复制代码
      函数      描述                  mean      均值              max      最大值              min      最小值              median      中位数              std      尺度差              count      计数              skew      偏度              quantile      指定分位数    以上为个人履历,希望能给各人一个参考,也希望各人多多支持脚本之家。如有错误或未思量完全的地方,望不吝赐教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作