拯救pandas计划(4)——DataFrame分组条件查找值

Python爬虫与数据挖掘

共 2165字,需浏览 5分钟

 · 2022-02-13

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

日暮东风怨啼鸟,落花犹似坠楼人。

拯救pandas计划(4)——DataFrame分组条件查找值

  • / 数据需求

  • / 需求拆解

  • / 需求处理

    • 方法一:

    • 方法二:

  • / 总结


大家好,我是【🌑(这是月亮的背面)】。最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数据操作库,身为一个数据工作者,基本上是张口pandas,闭口pandas了,故而写下此系列以让更多的小伙伴们爱上pandas。

系列文章说明:

系列名(系列文章序号)——此次系列文章具体解决的需求

平台:

  • windows 10
  • python 3.8
  • pandas >=1.2.4

/ 数据需求

依据各个用户的判断标签,且按照【甲乙丙丁……】依次排序,取得每个用户优先级最高的数据,其他标签列保留。如下图所示:

/ 需求拆解

既然是对每个用户进行判断标签优先级的提取,则可以对每个用户进行一个分组,在组内进行数据查找,下面给出两种我的实现方法。

/ 需求处理

方法一:

由于只有示例中只有一列其他标签,这里可以简单处理,如有不需要处理的列数较多,可以发挥想象是否能按照此方法进行提取。首先处理其他标签值,这里给它用列表包裹起来。

df['其他标签'] = df['其他标签'].map(lambda x: [x])

再按每用户每判断标签进行聚合,在上一步把其他标签处理成list类型,间接的方便了这里的聚合,使用sum对列表进行累加。

df = df.groupby(['用户''判断标签'], as_index=False)['其他标签'].sum()

之后对判断标签进行排序,这里说明下,早期pandas包的.sort_values没有key参数,需要自行升级包才能使用,在没有key参数之前对列进行自定义排序是一件比较麻烦的事,需要生成类别序列在该列上,这里只需要将每种类型用字典的形式,规范化各类别的顺序,通过key参数,调用map函数即可简单且快速的自定义列排序。

df.sort_values('判断标签', key=lambda x: x.map({'甲'1'乙'2'丙'3'丁'4}), inplace=True)

可以注意到,每用户每判断类型只有一行,顺序升序,这里只取优先级较高的判断标签,可以使用去重函数,保留第一次出现的行即可

df.drop_duplicates('用户', inplace=True)

现在离我们的目标还差一步之遥,唯一的区别就是其他标签是list类型,最后使用explode方法,单行生成多行的方式处理成目标形式。

df.explode('其他标签')

大功告成!

方法二:

文章开头提到过,既然是分组取优先级最高的值,那么不妨直接用groupby分组各用户,再对组内进行优先值查找。

def get_first_label(data):
    """判断并获取每一个分组内标签排序最上的值"""
    return data[data['判断标签'] == data.head(1)['判断标签'].values[0]]

# 可先对判断标签进行排序,再groupby分组
df.sort_values('判断标签', key=lambda x: x.map({'甲'1'乙'2'丙'3'丁'4}), inplace=True)
df.groupby(['用户']).apply(get_first_label).reset_index(drop=True)

结果:

/ 总结

分组查找也是在数据处理中比较常见的需求了,这里也仅仅是提供两种自己的浅显之见,其方法二,虽然看似代码行数少,但在执行效率上相比方法一略有逊色,当数据量增大时,每次groupby.apply调用函数会比较吃力,而方法一虽也有groupby,但是调用的是内部函数,且处理比较简单,自然会快一点,而作为去重,drop_duplicates当然是一把好手,该怎么处理数据还是看需求量及心情如何。

明日的太阳依旧升起,明天的我们也是大放光彩。


于二零二二年元月十四作

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

------------------- End -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报