聊一下关于去重计数的多种实现方式

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

[[403886]]

本文转载自微信公众号「数据大宇宙」,作者卡门的儿子。转载本文请联系数据大宇宙公众号。

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

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

如下数据:

数据描述:

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

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

下面是答案了

方式1

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

  1. len(df.order_id.drop_duplicates()) 
  2. 1834 
  • Series.drop_duplicates() 返回的仍然是一个 Series
  • len 函数可以计算 Series 值数量

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

方式2

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

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

正确的做法是:

  1. len(df.order_id.drop_duplicates().dropna()) 
  • 使用 Series.dropna() 方法可以去掉 nan 值

提示:

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

方式3

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

  1. df.order_id.drop_duplicates().count() 

点评:

这种方式个人认为最合适

方式4

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

  1. df.order_id.value_counts() 

  • Series.value_counts() 相当于 根据 order id 分组,统计数量。并且排除 nan

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

  1. df.order_id.value_counts().count() 

点评:

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

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

 

 

责任编辑:武晓燕 来源: 数据大宇宙
相关推荐

2017-07-04 17:43:07

架构CQRSEvent Sourc

2009-11-17 15:52:37

无线路由器

2021-04-21 14:19:52

javaignalHandle接口

2021-04-27 07:52:18

SQLNULLOR

2021-04-21 21:06:11

数据结构

2022-02-08 08:31:52

const关键字C语言

2021-03-26 00:20:34

NFT区块链数据库

2024-03-11 07:46:40

React优先级队列二叉堆

2021-06-30 00:19:43

AOP动态代理

2021-03-10 00:02:01

Redis

2021-05-31 06:28:35

AutoMapper对象映射器

2011-07-20 17:31:36

关系型数据库

2020-11-10 07:46:58

函数printf 数据

2021-05-30 19:01:59

工具IAST网络

2021-08-07 07:56:59

Node逻辑对象

2021-08-01 09:55:57

Netty时间轮中间件

2022-03-31 09:13:49

Cache缓存高并发

2022-06-27 08:24:34

JDKJavaJRE

2020-03-06 15:11:21

进程线程Web

2020-09-29 09:41:50

Spring Boot项目代码
点赞
收藏

51CTO技术栈公众号