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

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()
recycler_keydate 周date 年date 月记录数
01694周 12018一月6
11693周 12018一月14
21686周 12018一月20
31677周 12018一月62
41676周 12018一月25
  • 我们发现表格的表头有空格,且看起来不舒服,尝试使用上篇文章的改名功能,将表头修改为合理的格式
data.columns=['merchant','week','year','month','records']
data.head()
merchantweekyearmonthrecords
01694周 12018一月6
11693周 12018一月14
21686周 12018一月20
31677周 12018一月62
41676周 12018一月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()
monthmerchant0
0一月12
1一月2401
2一月2411
3一月2569
4一月2772
  • 将重建索引的生成的dataFrame再次groupby
data1.reset_index().groupby('month')['merchant'].size().reindex(['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']).reset_index()
monthmerchant
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()
monthmerchant
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()
monthmerchant
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()
monthmerchant
0一月615
1二月622
2三月359
3四月175
4五月209
5六月258
6七月320
7八月366
8九月417
9十月428
10十一月522
11十二月617
可以参考

image

posted on 2019-03-28 11:47 多一点 阅读(...) 评论(...) 编辑 收藏

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值