pandas pivot_table或者groupby实现sql 中的count distinct 功能
import pandas as pd
import numpy as np
data = pd.read_csv('活跃买家分析初稿.csv')
data.head()
  
    
      |  | 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()
  
    
      |  | 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,较为麻烦
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()
  
    
      |  | 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()
  
    
      |  | 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()
  
    
      |  | 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()
  
    
      |  | 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()
  
    
      |  | 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 | 
  
 
可以参考