pandas pivot_table或者groupby实现sql 中的count distinct 功能

import pandas as pd
import numpy as np
data = pd.read_csv('活跃买家分析初稿.csv')
data.head()

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
recycler_key date 周 date 年 date 月 记录数
0 1694 周 1 2018 一月 6
1 1693 周 1 2018 一月 14
2 1686 周 1 2018 一月 20
3 1677 周 1 2018 一月 62
4 1676 周 1 2018 一月 25
  • 我们发现表格的表头有空格,且看起来不舒服,尝试使用上篇文章的改名功能,将表头修改为合理的格式
data.columns=['merchant','week','year','month','records']
data.head()

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
merchant week year month records
0 1694 周 1 2018 一月 6
1 1693 周 1 2018 一月 14
2 1686 周 1 2018 一月 20
3 1677 周 1 2018 一月 62
4 1676 周 1 2018 一月 25
  • 我们的目标就是统计每个自然月内对应每个客户提交的周次数
  • 同样的原理,我们也可以统计自然月内客户数

方法一: 多重groupby,较为麻烦

  • 首先利用groupby求出每个月中商家提交订单数
data1 =data.groupby(['month','merchant']).size()
data1.head()
month  merchant
一月 1 2
240 1
241 1
256 9
277 2
dtype: int64
  • 重建索引
data1.reset_index().head()

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
month merchant 0
0 一月 1 2
1 一月 240 1
2 一月 241 1
3 一月 256 9
4 一月 277 2
  • 将重建索引的生成的dataFrame再次groupby
data1.reset_index().groupby('month')['merchant'].size().reindex(['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']).reset_index()

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
month merchant
0 一月 615
1 二月 622
2 三月 359
3 四月 175
4 五月 209
5 六月 258
6 七月 320
7 八月 366
8 九月 417
9 十月 428
10 十一月 522
11 十二月 617

方法2 pivot_table使用aggfunc 实现nunique方法

data2=data.pivot_table(index='month',values='merchant',aggfunc=lambda x:len(x.unique()))
data2.reindex(['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']).reset_index()

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
month merchant
0 一月 615
1 二月 622
2 三月 359
3 四月 175
4 五月 209
5 六月 258
6 七月 320
7 八月 366
8 九月 417
9 十月 428
10 十一月 522
11 十二月 617

方法3,直接采用Series的nunique方法

data3 = data.pivot_table(index='month',values='merchant',aggfunc=pd.Series.nunique)
data3.reindex(['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']).reset_index()

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
month merchant
0 一月 615
1 二月 622
2 三月 359
3 四月 175
4 五月 209
5 六月 258
6 七月 320
7 八月 366
8 九月 417
9 十月 428
10 十一月 522
11 十二月 617

方法4 使用单个的groupby,聚合使用nunique方法

data4 = data.groupby(['month']).agg({'merchant': pd.Series.nunique})
data4.reindex(['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']).reset_index()

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
month merchant
0 一月 615
1 二月 622
2 三月 359
3 四月 175
4 五月 209
5 六月 258
6 七月 320
7 八月 366
8 九月 417
9 十月 428
10 十一月 522
11 十二月 617

可以参考

pandas pivot_table或者groupby实现sql 中的count distinct 功能的更多相关文章

  1. VC++2005下的ADO SQL语句(like,count,distinct)和操作(转)

    http://blog.sina.com.cn/s/blog_56fd66a70100hxjf.html http://timke.blog.163.com/blog/#m=0 环境:MFC  Dia ...

  2. Python中实现count(distinct )

    假设一个表有6个字段c1,c2,c3,c4,c5,c6,有如下的sql语句: select c1,count(distinct(c6)) from tbl where c3>1 group by ...

  3. 知方可补不足~SQL中的count命令的一些优化措施(百万以上数据明显)

    回到目录 SQL中对于求表记录总数的有count这个聚合命令,这个命令给我们感觉就是快,比一般的查询要快,但是,当你的数据表记录比较多时,如百万条,千万条时,对于count来说,就不是那么快了,我们需 ...

  4. SQL中以count及sum为条件的查询

    在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7   例1:查询出现 ...

  5. SQL中以count或sum为条件的查询方式

    在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7   例1:查询出现 ...

  6. sql中unique和distinct

    在SQL语法里面,有unique和distinct两个关键字, unique是distinct的同义词,功能完全相同.distinct是标准语法,其他数据库 sql server,db2,oracle ...

  7. sql中简单的触发器功能

    触发器分为DML触发器和DDL触发器DML触发器包含After触发器,执行insert update delete语句后会触发after触发器,会事务回滚DML触发器还包含instead of触发器, ...

  8. Linq 实现普通sql中 where in 的功能

    user.ProjectIds 的值是使用逗号分隔的 例如:1,2,3 projectList = (from a in projectList where (user.ProjectIds.Spli ...

  9. SQL中 select count(1) count中的1 到底是什么意思呢?和count(*)的区别

    count(1),其实就是计算一共有多少符合条件的行. 1并不是表示第一个字段,而是表示一个固定值.其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.同 ...

随机推荐

  1. 【组合&取补集】数三角形 @CQOI2014/BZOJ3505/upcexam3843

    http://exam.upc.edu.cn/problem.php?id=3843&csrf=8oK86t2oHSgi3Q4SX3qOJGeENe6pfXri 时间限制: 1 Sec 内存限 ...

  2. Oracle中连接与加号(+)的使用

    1.左外连接(Left outer join/ left join) left join是以左表的记录为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录.右表记录不足的地方均为NU ...

  3. .NET分布式缓存Redis从入门到实战

    一.课程介绍 今天阿笨给大家带来一堂NOSQL的课程,本期的主角是Redis.希望大家学完本次分享课程后对redis有一个基本的了解和认识,并且熟悉和掌握 Redis在.NET中的使用. 本次分享课程 ...

  4. Android的Databinding-数据、Map绑定

    本节主要说Collection的字符串数组.List.SparseArray.Map的绑定.先看看xml的布局. <layout xmlns:android="http://schem ...

  5. JAVA调用外部安装7-Zip压缩和解压zip文件

    1.首先在本地安装7-Zip(下载链接:https://www.7-zip.org/)2.调用7-Zip压缩.zip文件: /**      * 生成.zip压缩文件      * @param fi ...

  6. Linux系统下分析内存使用情况的管理工具

    有许多办法可以获得Linux系统上所安装内存的信息,并查看其中有多少内存正在使用中.有的命令会展示大量的细节,而有的命令则提供了简洁(但不一定容易理解)的结果.在这篇文章中将介绍一些更有用的工具,帮助 ...

  7. 【JavaScript从入门到精通】第三课 初探JavaScript魅力-03

    第三课 初探JavaScript魅力-03 函数传参 上节课的时候我们已经讲了什么是函数,实际上,函数在功能上就类似于css的class一样,将一段代码包裹起来使用.为了让函数的功能更加的丰富和实用, ...

  8. oracle 在已有表新增列内批量加数据

    创建每列随机值的语句 create table TEST_ZHAA01A_03 as select rownum as id, to_char(sysdate + rownum/24/3600, 'y ...

  9. How to trigger a Kubernetes cronjob manually-手动触发一个cronjob

    What should you do when you’ve developed and installed a cron job for your Kubernetes application, a ...

  10. np.percentile获取中位数、百分位数

    给定一个递增数组a,求它的中位数. np.percentile(a,50) 中位数就是50%处的数字,也可以获得0%.100%处的数字,0%处的数字就是第一个数字,100%处的数字就是最后一个数字.1 ...