pyodps中一些经验:取分组排序后的第一条数据

举报
橙子园 发表于 2022/05/26 00:34:23 2022/05/26
【摘要】 注意:未经允许不得转载, 允许后转载请注明出处 pyodps中有很多本来在pandas中一个API解决的东西却要想半天才能搞定。 pandas中在groupby后只要用first就可以去出分组后的第一行。 例如: # 以student_id为分组列,然后取出分组后每组的第一条数据df_stu_frist_course = df_...

注意:未经允许不得转载, 允许后转载请注明出处

pyodps中有很多本来在pandas中一个API解决的东西却要想半天才能搞定。

pandas中在groupby后只要用first就可以去出分组后的第一行。

例如:


  
  1. # 以student_id为分组列,然后取出分组后每组的第一条数据
  2. df_stu_frist_course = df_stu_course.groupby('student_id').first()

然而pyodps中却很坑爹,没有什么first,只能自己想办法。这里我又添加了一个排序

例如:

# 首先用student_id进行分组,然后用student_id和gmt_create进行排序,最后用窗口函数nth_value取分组中的第一个值并改名first_course_id, 并将其他字段输出


  
  1. df_group = df.groupby('student_id')
  2. df_inst_stu_cou = df_inst_stu_cou['student_id', df_group.sort(['student_id', 'gmt_create'], ascending=[True, False]).course_id.nth_value(0).rename('first_course_id')]

 # 但是这是并不是取出第一行,而是将所有以student_id分为一组的数据的其他列数据都改为排序后的第一个值, 也就是说原df_inst_stu_cou还没有分组,只是添加了分组的后取出第一个值的一列,所以我们要以student_id分组去重。
所以我们只要再以student_id分组,然后用聚合函数cat将其他所有的列按照行进行连接(这里我的连接符选择了逗号),然后在map函数中用split分割成列表取第一个即可


  
  1. df = df.groupby('student_id').agg(df.first_course_id.cat(sep=',').rename('first_course_ids'))
  2. df['first_course_name'] = df.first_course_names.map(lambda x: x.split(',')[0], 'string')

 

文章来源: blog.csdn.net,作者:橙子园,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Chenftli/article/details/86626842

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。