python中的groupby详解

Python学习笔记:itertools 中的groupby的用法详解

利用代码的结果展示更为清晰

from operator import itemgetter 
from itertools import groupby 

s1={'name':'wtc','school':'QH','age':21}
s2={'name':'hpl','school':'ND','age':22}
s3={'name':'bfd','school':'ND','age':19}
s4={'name':'hzl','school':'MIT','age':25}
s5={'name':'gmc','school':'MIT','age':22}
s6={'name':'jeamsbandon','school':'MIT','age':24}

lst=[s1,s2,s3,s4,s5,s6]

#通过school进行分组

lst.sort(key=itemgetter('school'))
ls = groupby(lst,itemgetter('school')) 


for value,groups in ls:
    for group in groups: 
        print (value,group)

程序运行后的结果:
在这里插入图片描述

Groupby使用之前先进行排序,如果不排序无法进行分组,或者说分组可能达不到预期。sort()是永久性排序,会改变原列表顺序;sorted()是临时排序,不会改变原列表顺序。lst=[s1,s2,s3,s4,s5,s6] 把这六个字典存在列表中,使用sort排序对列表操作。lst.sort(key=itemgetter(‘school’))的意思是按字典中键值对中的键school对应的值来进行排序。等待排序完成后执行ls = groupby(lst,itemgetter(‘school’)) 这时的操作是把排好序的列表lst再进行分组,还是按照 键school对应的值来进行分组。所以就会分成[{‘name’:‘hpl’,‘school’:‘ND’,‘age’:22},{‘name’:‘bfd’,‘school’:‘ND’,‘age’:19}]这两个一组,然后[{‘name’:‘wtc’,‘school’:‘QH’,‘age’:21} ]自己一组。 [{‘name’:‘hzl’,‘school’:‘MIT’,‘age’:25},{‘name’:‘gmc’,‘school’:‘MIT’,‘age’:22},{‘name’:‘jeamsbandon’,‘school’:‘MIT’,‘age’:24}]三个一组,然后for value,groups in ls: for group in groups: print value,group 中value取的是键school对应的值,而groups取的是一个组,也就是上面三个组,所以group取的是组内的一整个字典。

下面是对数值进行操作:

from itertools import groupby
lst=[45, 70, 55, 66, 87, 98, 100, 88, 96, 68]

def sorts(valuess):
    if valuess < 60:
        return 'not pass'
    elif valuess >= 90:
        return 'excellence'
    else:
        return 'OK'

print ([(value,list(group)) for value,group in groupby(sorted(lstt),key=sorts)])

程序运行后的结果:
在这里插入图片描述
[(k,list(g))for k,g in groupby(sorted(lst),key=gb)] sorted(lst)对于列表lst中的数值进行临时排序,排序时的关键字是按照从函数gb中返回来的结果。groupby(sorted(lst),key=gb) 然后进行分组,因为排序是从小到大的顺序进行排列的,所以整个分组的结果就是[(‘less’, [2, 6, 8, 9]), (‘middle’, [11, 25, 29]), (‘great’, [43, 51, 66])]
,而变成列表方式输出是因为(k,list(g))首先把g取回来的组变成了列表形式,最后输出的时使用列表框括起来的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,使用groupby函数对数据进行分组后,结果显示的是用于分组的列的值,并且对每个分组进行了聚合计算。根据引用和引用的示例代码,可以看到使用groupby后,输出的结果只显示了用于分组的列,而不显示最终的聚合计算结果。如果需要显示聚合计算结果,可以使用agg函数进行计算并指定需要的聚合函数,如sum、mean、std等。在引用的示例代码,通过agg函数一次计算了三个聚合函数,即sum、mean和std。在引用的示例代码,通过sum函数将分组后的结果进行求和,并显示了Line和NO.两列的聚合结果。所以,groupby的结果显示取决于你在代码使用的聚合函数和指定的列。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [详解pythongroupby函数通俗易懂](https://blog.csdn.net/weixin_29968283/article/details/112833627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [【debug】Python pandas dataframe.groupby().sum不显示结果,只显示groupby的条件列](https://blog.csdn.net/weixin_44127624/article/details/125599269)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值