前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas每天一题-题目8:去重计数的多种实现方式

pandas每天一题-题目8:去重计数的多种实现方式

作者头像
咋咋
发布2021-09-01 14:21:48
2.8K0
发布2021-09-01 14:21:48
举报
文章被收录于专栏:数据大宇宙

这是一个关于 pandas 从基础到进阶的练习题系列,来源于 github 上的 guipsamora/pandas_exercises 。这个项目从基础到进阶,可以检验你有多么了解 pandas。

我会挑选一些题目,并且提供比原题库更多的解决方法以及更详尽的解析

计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!

上期文章:pandas每天一题-题目7:批量列计算

后台回复"数据",可以下载本题数据集

如下数据:

数据描述:

  • 此数据是订单明细表。一个订单会包含很多明细项,表中每个样本(每一行)表示一个明细项
  • order_id 列存在重复
  • quantity 是明细项数量

需求:数据中共有多少个订单?

下面是答案了


方式1

因为 order_id 列是存在重复的,那么一种比较直观的方式就是去重+计数:

代码语言:javascript
复制
len(df.order_id.drop_duplicates())
代码语言:javascript
复制
1834
  • Series.drop_duplicates() 返回的仍然是一个 Series
  • len 函数可以计算 Series 值数量

但是你可能不知道的是,这个方式是不准确的!


方式2

之所以说上一种方式是不准确,是因为没有考虑到空值的问题。

len 函数不会忽略空值(nan) ,因此如果列中有空值,那么就比正确结果数量多。

正确的做法是:

代码语言:javascript
复制
len(df.order_id.drop_duplicates().dropna())
  • 使用 Series.dropna() 方法可以去掉 nan 值

提示:

即使列中有多个 nan ,经过去重后只会保留一个 nan 值


方式3

实际上,pandas 本身有提供一个忽略 nan 的计数方法:

代码语言:javascript
复制
df.order_id.drop_duplicates().count()

点评:

  1. 这种方式个人认为最合适

方式4

pandas 为列(Series)提供了一个快速汇总计数方法:

代码语言:javascript
复制
df.order_id.value_counts()
  • Series.value_counts() 相当于 根据 order id 分组,统计数量。并且排除 nan

这相当于实现了去重,因此:

代码语言:javascript
复制
df.order_id.value_counts().count()

点评:

  1. 这是原项目的解法,不太直观,不推荐使用
  2. 我本人经常把 value_counts 方法中s的位置搞错

不过我自制了一个方法查询器,这样子不至于记错方法:

推荐阅读:

python 方法太多了,怎么记住?在 JupyterNotebook中这几招很有用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方式1
  • 方式2
  • 方式3
  • 方式4
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档