pandas pivot_table或者groupby实现sql 中的count distinct 功能
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 |
可以参考
- refer this stackoverflow

pandas pivot_table或者groupby实现sql 中的count distinct 功能的更多相关文章
- 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 ...
- Python中实现count(distinct )
假设一个表有6个字段c1,c2,c3,c4,c5,c6,有如下的sql语句: select c1,count(distinct(c6)) from tbl where c3>1 group by ...
- 知方可补不足~SQL中的count命令的一些优化措施(百万以上数据明显)
回到目录 SQL中对于求表记录总数的有count这个聚合命令,这个命令给我们感觉就是快,比一般的查询要快,但是,当你的数据表记录比较多时,如百万条,千万条时,对于count来说,就不是那么快了,我们需 ...
- SQL中以count及sum为条件的查询
在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7 例1:查询出现 ...
- SQL中以count或sum为条件的查询方式
在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7 例1:查询出现 ...
- sql中unique和distinct
在SQL语法里面,有unique和distinct两个关键字, unique是distinct的同义词,功能完全相同.distinct是标准语法,其他数据库 sql server,db2,oracle ...
- sql中简单的触发器功能
触发器分为DML触发器和DDL触发器DML触发器包含After触发器,执行insert update delete语句后会触发after触发器,会事务回滚DML触发器还包含instead of触发器, ...
- Linq 实现普通sql中 where in 的功能
user.ProjectIds 的值是使用逗号分隔的 例如:1,2,3 projectList = (from a in projectList where (user.ProjectIds.Spli ...
- SQL中 select count(1) count中的1 到底是什么意思呢?和count(*)的区别
count(1),其实就是计算一共有多少符合条件的行. 1并不是表示第一个字段,而是表示一个固定值.其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.同 ...
随机推荐
- C#异步Task编程模型实战手册
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
- arcgis 获得工具箱工具的个数
import arcgisscripting import string; gp = arcgisscripting.create(9.3); ##多少个工具箱 toolboxes = gp.list ...
- 【linux】linux下准确查询正在tomcat下运行的java进程。准确获取正在运行的java进程的PID
准确获取定位到tomcat下正在运行的java进程的PID命令: ps -ef|grep java | grep catalina | awk '{print $2}' 准确定位到tomcat下正在运 ...
- webpack Import 动态文件
其实React Import scss 是非常简单的,比如一般写法import './PromotionPage.scss';,今天遇到一个样式需要覆盖,那么修改后的代码变成了: import './ ...
- ECharts JS应用:图表页面实现
因为要统计数据进行图表展示,所以就简单学习了 ECharts JS 的应用.它是一个纯Javascript图库,它依赖于一个轻量级的Canvas库 ZRender,并提供直观.生动.交互式和高度可定制 ...
- [转]恕我直言,在座的各位根本不会写 Java!
导语 自 2013 年毕业后,今年已经是我工作的第 4 个年头了,总在做 Java 相关的工作,终于有时间坐下来,写一篇关于 Java 写法的一篇文章,来探讨一下如果你真的是一个 Java 程序员,那 ...
- springcloud如何实现服务的平滑发布
在之前的文章中我们提到服务的优雅下线,见: SpringCloud服务如何在Eureka安全优雅的下线 但这个对于ribbon调用其实是不平滑的,shutdown请求到后服务就马上关闭了,服务消费此时 ...
- MinFilter(MaxFilter)快速算法C++实现
目录 1.算法简述 1.1.MinFilter(MaxFilter) 算法简述 1.2.MinFilter(MaxFilter) 快速算法简述 2.实现代码 2.1.MinFilterOneRow 单 ...
- 【转】关于提示can't load package 'xxx.bpl.' 错误问题的解决方法
转自: http://blog.sina.com.cn/s/blog_44fa172f0102v9x3.html 'xxx.bpl'包实际存在, 路径并且正确. 但是总提示'can ...
- 理解JAVA的IO
1. 什么是流Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列 ...
