In [2]:
import pandas as pd
import numpy as np
from pandas import DataFrame
import matplotlib.pyplot as plt
%matplotlib inline
In [17]:
df = pd.read_csv('./CDNOW_master.txt',header=None,sep='\s+',names=['user_id','order_dt','order_product','order_amount'])
df.head()
Out[17]:
user_id | order_dt | order_product | order_amount | |
---|---|---|---|---|
0 | 1 | 19970101 | 1 | 11.77 |
1 | 2 | 19970112 | 1 | 12.00 |
2 | 2 | 19970112 | 5 | 77.00 |
3 | 3 | 19970102 | 2 | 20.76 |
4 | 3 | 19970330 | 2 | 20.76 |
In [5]:
df.info()
RangeIndex: 69659 entries, 0 to 69658
Data columns (total 4 columns):
user_id 69659 non-null int64
order_dt 69659 non-null int64
order_product 69659 non-null int64
order_amount 69659 non-null float64
dtypes: float64(1), int64(3)
memory usage: 2.1 MB
In [55]:
df.describe()
Out[55]:
user_id | order_product | order_amount | |
---|---|---|---|
count | 69659.000000 | 69659.000000 | 69659.000000 |
mean | 11470.854592 | 2.410040 | 35.893648 |
std | 6819.904848 | 2.333924 | 36.281942 |
min | 1.000000 | 1.000000 | 0.000000 |
25% | 5506.000000 | 1.000000 | 14.490000 |
50% | 11410.000000 | 2.000000 | 25.980000 |
75% | 17273.000000 | 3.000000 | 43.700000 |
max | 23570.000000 | 99.000000 | 1286.010000 |
In [18]:
#order_dt转换成时间序列
df['order_dt'] = pd.to_datetime(df['order_dt'],format='%Y%m%d')
df.head()
Out[18]:
user_id | order_dt | order_product | order_amount | |
---|---|---|---|---|
0 | 1 | 1997-01-01 | 1 | 11.77 |
1 | 2 | 1997-01-12 | 1 | 12.00 |
2 | 2 | 1997-01-12 | 5 | 77.00 |
3 | 3 | 1997-01-02 | 2 | 20.76 |
4 | 3 | 1997-03-30 | 2 | 20.76 |
In [10]:
df.info()
RangeIndex: 69659 entries, 0 to 69658
Data columns (total 4 columns):
user_id 69659 non-null int64
order_dt 69659 non-null datetime64[ns]
order_product 69659 non-null int64
order_amount 69659 non-null float64
dtypes: datetime64[ns](1), float64(1), int64(2)
memory usage: 2.1 MB
In [19]:
#添加新的一列表示月份
#使用Series调用astype('数据类型'):将Serise的元素转换成指定的数据类型
df['month'] = df['order_dt'].values.astype('datetime64[M]')
df.head()
Out[19]:
user_id | order_dt | order_product | order_amount | month | |
---|---|---|---|---|---|
0 | 1 | 1997-01-01 | 1 | 11.77 | 1997-01-01 |
1 | 2 | 1997-01-12 | 1 | 12.00 | 1997-01-01 |
2 | 2 | 1997-01-12 | 5 | 77.00 | 1997-01-01 |
3 | 3 | 1997-01-02 | 2 | 20.76 | 1997-01-01 |
4 | 3 | 1997-03-30 | 2 | 20.76 | 1997-03-01 |
In [23]:
#用户每月花费的总金额
month_amount_series = df.groupby(by='month')['order_amount'].sum()
month_amount_series
. . .
In [24]:
month_amount_series.plot()
Out[24]:
``
In [26]:
#所有用户每月的产品购买量
df.groupby(by='month')['order_product'].sum().plot()
Out[26]:
In [29]:
#所有用户每月的消费总次数
df.groupby(by=‘month’)[‘user_id’].count().plot()
Out[29]:
``
In [30]:
#统计每月的消费人数(去重)
df.groupby(by=‘month’)[‘user_id’].nunique()
. . .
In [36]:
#高级聚合操作
df.groupby(by=‘month’)[‘user_id’].apply(lambda x:len(x.drop_duplicates()))
Out[36]:
month
1997-01-01 7846
1997-02-01 9633
1997-03-01 9524
1997-04-01 2822
1997-05-01 2214
1997-06-01 2339
1997-07-01 2180
1997-08-01 1772
1997-09-01 1739
1997-10-01 1839
1997-11-01 2028
1997-12-01 1864
1998-01-01 1537
1998-02-01 1551
1998-03-01 2060
1998-04-01 1437
1998-05-01 1488
1998-06-01 1506
Name: user_id, dtype: int64
### 第三部分:用户个体消费数据分析
- 用户消费总金额和消费总次数的统计描述
- 用户消费金额和消费次数的散点图
- 各个用户消费总金额的直方分布图(消费金额在1000之内的分布)
- 各个用户消费的总数量的直方分布图(消费商品的数量在100次之内的分布)
In [37]:
#用户消费总金额和消费总次数的统计描述
df.describe()
Out[37]:
| | user_id | order_product | order_amount |
| ----: | -----------: | ------------: | -----------: |
| count | 69659.000000 | 69659.000000 | 69659.000000 |
| mean | 11470.854592 | 2.410040 | 35.893648 |
| std | 6819.904848 | 2.333924 | 36.281942 |
| min | 1.000000 | 1.000000 | 0.000000 |
| 25% | 5506.000000 | 1.000000 | 14.490000 |
| 50% | 11410.000000 | 2.000000 | 25.980000 |
| 75% | 17273.000000 | 3.000000 | 43.700000 |
| max | 23570.000000 | 99.000000 | 1286.010000 |
In [39]:
#用户消费金额和消费次数的散点图
user_amount = df.groupby(by=‘user_id’)[‘order_amount’].sum()
user_oder_count = df.groupby(by=‘user_id’)[‘order_product’].count()
In [41]:
#绘制散点图
plt.scatter(user_oder_count,user_amount)
plt.xlabel(‘count’)
plt.ylabel(‘amount’)
Out[41]:
Text(0,0.5,‘amount’)
In [47]:
#各个用户消费总金额的直方分布图(消费金额在1000之内的分布)
user_amount_1000 = df.groupby(by=‘user_id’).sum().query(‘order_amount <= 1000’)[‘order_amount’]
plt.hist(user_amount_1000)
. . .
In [51]:
#各个用户消费的总数量的直方分布图(消费商品的数量在100之内的分布)
user_product_count = df.groupby(by=‘user_id’).sum().query(‘order_product <= 100’)[‘order_product’]
plt.hist(user_product_count)
Out[51]:
(array([19543., 2330., 830., 328., 185., 116., 57., 42.,
39., 21.]),
array([ 1. , 10.7, 20.4, 30.1, 39.8, 49.5, 59.2, 68.9, 78.6, 88.3, 98. ]),
)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vJhu0Rn7-1579945928563)(data:image/png;base64,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)]
### 第四部分:用户消费行为分析
- 用户第一次消费的月份分布,和人数统计
- 绘制线形图
- 用户最后一次消费的时间分布,和人数统计
- 绘制线形图
- 新老客户的占比
- 消费一次为新用户
- 消费多次为老用户
- 分析出每一个用户的第一个消费和最后一次消费的时间
- agg(['func1','func2']):对分组后的结果进行指定聚合
- 分析出新老客户的消费比例
- 用户分层
- 分析得出每个用户的总购买量和总消费金额and最近一次消费的时间的表格rfm
- RFM模型设计
- R表示客户最近一次交易时间的间隔。
- /np.timedelta64(1,'D'):去除days
- F表示客户购买商品的总数量,F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
- M表示客户交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。
- 将R,F,M作用到rfm表中
- 根据价值分层,将用户分为:
- 重要价值客户
- 重要保持客户
- 重要挽留客户
- 重要发展客户
- 一般价值客户
- 一般保持客户
- 一般挽留客户
- 一般发展客户
- 使用已有的分层模型即可rfm_func
In [60]:
#用户第一次消费的月份分布,和人数统计
#思路:找出用户购买月份的最小值,进行数量统计
df.groupby(by=‘user_id’)[‘month’].min().value_counts()
Out[60]:
1997-02-01 8476
1997-01-01 7846
1997-03-01 7248
Name: month, dtype: int64
In [62]:
df.groupby(by=‘user_id’)[‘month’].min().value_counts().plot()
Out[62]:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nbyxcj26-1579945928564)(data:image/png;base64,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)]
In [65]:
#用户最后一次消费的月份分布,和人数统计
df.groupby(by=‘user_id’)[‘month’].max().value_counts()
. . .
In [66]:
df.groupby(by=‘user_id’)[‘month’].max().value_counts().plot()
Out[66]:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0NAsM7MD-1579945928565)(data:image/png;base64,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)]
In [ ]:
#分析出新老客户的消费比例
In [69]:
#新用户:用户的首次购买时间和最后一次购买时间,两个时间一样,则表示该用户只购买了一次为新用户
#老用户:不同上为老用户
df_dt_min_max = df.groupby(by=‘user_id’)[‘order_dt’].agg([‘min’,‘max’,])#agg([‘func1’,‘func2’]):对分组后的结果进行指定多种形式聚合
df_dt_min_max.head()
Out[69]:
| | min | max |
| ------: | ---------: | ---------: |
| user_id | | |
| 1 | 1997-01-01 | 1997-01-01 |
| 2 | 1997-01-12 | 1997-01-12 |
| 3 | 1997-01-02 | 1998-05-28 |
| 4 | 1997-01-01 | 1997-12-12 |
| 5 | 1997-01-01 | 1998-01-03 |
In [71]:
(df_dt_min_max[‘min’] == df_dt_min_max[‘max’]).value_counts()
Out[71]:
True 12054
False 11516
dtype: int64
In [83]:
#分析得出每个用户的总购买量和总消费金额and最近(最后)一次消费的时间的表格rfm
rfm = df.pivot_table(index=‘user_id’,aggfunc={‘order_product’:‘sum’,‘order_amount’:‘sum’,‘order_dt’:‘max’})
rfm.head()
Out[83]:
| | order_amount | order_dt | order_product |
| ------: | -----------: | ---------: | ------------: |
| user_id | | | |
| 1 | 11.77 | 1997-01-01 | 1 |
| 2 | 89.00 | 1997-01-12 | 6 |
| 3 | 156.46 | 1998-05-28 | 16 |
| 4 | 100.50 | 1997-12-12 | 7 |
| 5 | 385.61 | 1998-01-03 | 29 |
In [84]:
#R列表示客户最近一次交易时间的间隔。/np.timedelta64(1,‘D’):去除days
rfm[‘R’] = -(rfm[‘order_dt’] - rfm[‘order_dt’].max())/np.timedelta64(1,‘D’)
rfm.head()
Out[84]:
| | order_amount | order_dt | order_product | R |
| ------: | -----------: | ---------: | ------------: | ----: |
| user_id | | | | |
| 1 | 11.77 | 1997-01-01 | 1 | 545.0 |
| 2 | 89.00 | 1997-01-12 | 6 | 534.0 |
| 3 | 156.46 | 1998-05-28 | 16 | 33.0 |
| 4 | 100.50 | 1997-12-12 | 7 | 200.0 |
| 5 | 385.61 | 1998-01-03 | 29 | 178.0 |
In [85]:
#将rfm模型对应的数据整合出来
#r:购买的时间间隔
#f:购买商品的总量
#m:购买商品花费的总金额
rfm = rfm[[‘order_amount’,‘order_product’,‘R’]]
rfm.rename(columns={‘order_amount’:‘M’,‘order_product’:‘F’},inplace=True)
rfm.head()
Out[85]:
| | M | F | R |
| ------: | -----: | ---: | ----: |
| user_id | | | |
| 1 | 11.77 | 1 | 545.0 |
| 2 | 89.00 | 6 | 534.0 |
| 3 | 156.46 | 16 | 33.0 |
| 4 | 100.50 | 7 | 200.0 |
| 5 | 385.61 | 29 | 178.0 |
In [86]:
def rfm_func(x):# -94.310426 -6.122656 177.778362
#存储存储的是三个字符串形式的0或者1
level = x.map(lambda x :‘1’ if x >= 0 else ‘0’)
label = level[‘R’]+ level[‘F’] + level.M #==>level[‘M’]
d = {
‘111’:‘重要价值客户’,
‘011’:‘重要保持客户’,
‘101’:‘重要挽留客户’,
‘001’:‘重要发展客户’,
‘110’:‘一般价值客户’,
‘010’:‘一般保持客户’,
‘100’:‘一般挽留客户’,
‘000’:‘一般发展客户’
}
result = d[label]
return result
#df.apply(func):可以对df中的行或者列进行某种(func)形式的运算
rfm[‘label’] = rfm.apply(lambda x : x - x.mean()).apply(rfm_func,axis = 1)
rfm.head()
Out[86]:
| | M | F | R | label |
| ------: | -----: | ---: | ----: | -----------: |
| user_id | | | | |
| 1 | 11.77 | 1 | 545.0 | 一般挽留客户 |
| 2 | 89.00 | 6 | 534.0 | 一般挽留客户 |
| 3 | 156.46 | 16 | 33.0 | 重要保持客户 |
| 4 | 100.50 | 7 | 200.0 | 一般发展客户 |
| 5 | 385.61 | 29 | 178.0 | 重要保持客户 |
#### 用户的生命周期
- 将用户划分为活跃用户和其他用户
- 统计每个用户每个月的消费次数
- 统计每个用户每个月是否消费,消费记录为1否则记录为0
- 知识点:DataFrame的apply和applymap的区别
- applymap:返回df
- 将函数做用于DataFrame中的所有元素(elements)
- apply:返回Series
- apply()将一个函数作用于DataFrame中的每个行或者列
- 将用户按照每一个月份分成:
- unreg:观望用户(前两月没买,第三个月才第一次买,则用户前两个月为观望用户)
- unactive:首月购买后,后序月份没有购买则在没有购买的月份中该用户的为非活跃用户
- new:当前月就进行首次购买的用户在当前月为新用户
- active:连续月份购买的用户在这些月中为活跃用户
- return:购买之后间隔n月再次购买的第一个月份为该月份的回头客
In [94]:
#统计每个用户每个月的消费次数
df_purchase = df.pivot_table(index=‘user_id’,aggfunc=‘count’,values=‘order_dt’,columns=‘month’).fillna(0)
df_purchase.head(5)
Out[94]:
| month | 1997-01-01 00:00:00 | 1997-02-01 00:00:00 | 1997-03-01 00:00:00 | 1997-04-01 00:00:00 | 1997-05-01 00:00:00 | 1997-06-01 00:00:00 | 1997-07-01 00:00:00 | 1997-08-01 00:00:00 | 1997-09-01 00:00:00 | 1997-10-01 00:00:00 | 1997-11-01 00:00:00 | 1997-12-01 00:00:00 | 1998-01-01 00:00:00 | 1998-02-01 00:00:00 | 1998-03-01 00:00:00 | 1998-04-01 00:00:00 | 1998-05-01 00:00:00 | 1998-06-01 00:00:00 |
| ------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: |
| user_id | | | | | | | | | | | | | | | | | | |
| 1 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 2 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 3 | 1.0 | 0.0 | 1.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 |
| 4 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 5 | 2.0 | 1.0 | 0.0 | 1.0 | 1.0 | 1.0 | 1.0 | 0.0 | 1.0 | 0.0 | 0.0 | 2.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
In [96]:
#统计每个用户每个月是否消费,消费记录为1否则记录为0
df_purchase = df_purchase.applymap(lambda x:1 if x > 0 else 0)
#df.applymap(func):df的一个运算工具,运算对应的是df中的每一个元素
df_purchase.head(7)
Out[96]:
| month | 1997-01-01 00:00:00 | 1997-02-01 00:00:00 | 1997-03-01 00:00:00 | 1997-04-01 00:00:00 | 1997-05-01 00:00:00 | 1997-06-01 00:00:00 | 1997-07-01 00:00:00 | 1997-08-01 00:00:00 | 1997-09-01 00:00:00 | 1997-10-01 00:00:00 | 1997-11-01 00:00:00 | 1997-12-01 00:00:00 | 1998-01-01 00:00:00 | 1998-02-01 00:00:00 | 1998-03-01 00:00:00 | 1998-04-01 00:00:00 | 1998-05-01 00:00:00 | 1998-06-01 00:00:00 |
| ------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: |
| user_id | | | | | | | | | | | | | | | | | | |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 4 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| 6 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
In [ ]:
将用户按照每一个月份分成:
unreg:观望用户(前两月没买,第三个月才第一次买,则用户前两个月为观望用户)
unactive:首月购买后,后序月份没有购买则在没有购买的月份中该用户的为非活跃用户
new:当前月就进行首次购买的用户在当前月为新用户
active:连续月份购买的用户在这些月中为活跃用户
return:购买之后间隔n月再次购买的第一个月份为该月份的回头客
In [97]:
#将df_purchase中的原始数据0和1修改为new,unactive…,返回新的df叫做df_purchase_new
#固定算法
def active_status(data): #data就是df_purchase中的某一行数据(0,1不同分布组成)
status = []#某个用户每一个月的活跃度
for i in range(18):
#若本月没有消费
if data[i] == 0:
if len(status) > 0:
if status[i-1] == 'unreg':
status.append('unreg')
else:
status.append('unactive')
else:
status.append('unreg')
#若本月消费
else:
if len(status) == 0:
status.append('new')
else:
if status[i-1] == 'unactive':
status.append('return')
elif status[i-1] == 'unreg':
status.append('new')
else:
status.append('active')
return status
pivoted_status = df_purchase.apply(active_status,axis = 1)
pivoted_status.head()
Out[97]:
| month | 1997-01-01 00:00:00 | 1997-02-01 00:00:00 | 1997-03-01 00:00:00 | 1997-04-01 00:00:00 | 1997-05-01 00:00:00 | 1997-06-01 00:00:00 | 1997-07-01 00:00:00 | 1997-08-01 00:00:00 | 1997-09-01 00:00:00 | 1997-10-01 00:00:00 | 1997-11-01 00:00:00 | 1997-12-01 00:00:00 | 1998-01-01 00:00:00 | 1998-02-01 00:00:00 | 1998-03-01 00:00:00 | 1998-04-01 00:00:00 | 1998-05-01 00:00:00 | 1998-06-01 00:00:00 |
| ------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: |
| user_id | | | | | | | | | | | | | | | | | | |
| 1 | new | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive |
| 2 | new | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive | unactive |
| 3 | new | unactive | return | active | unactive | unactive | unactive | unactive | unactive | unactive | return | unactive | unactive | unactive | unactive | unactive | return | unactive |
| 4 | new | unactive | unactive | unactive | unactive | unactive | unactive | return | unactive | unactive | unactive | return | unactive | unactive | unactive | unactive | unactive | unactive |
| 5 | new | active | unactive | return | active | active | active | unactive | return | unactive | unactive | return | active | unactive | unactive | unactive | unactive | unactive |
- 每月【不同活跃】用户的计数
- purchase_status_ct = df_purchase_new.apply(lambda x : pd.value_counts(x)).fillna(0)
- 转置进行最终结果的查看
In [99]:
pivoted_status.apply(lambda x:pd.value_counts(x)).fillna(0)
Out[99]:
| month | 1997-01-01 00:00:00 | 1997-02-01 00:00:00 | 1997-03-01 00:00:00 | 1997-04-01 00:00:00 | 1997-05-01 00:00:00 | 1997-06-01 00:00:00 | 1997-07-01 00:00:00 | 1997-08-01 00:00:00 | 1997-09-01 00:00:00 | 1997-10-01 00:00:00 | 1997-11-01 00:00:00 | 1997-12-01 00:00:00 | 1998-01-01 00:00:00 | 1998-02-01 00:00:00 | 1998-03-01 00:00:00 | 1998-04-01 00:00:00 | 1998-05-01 00:00:00 | 1998-06-01 00:00:00 |
| -------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: | ------------------: |
| active | 0.0 | 1157.0 | 1681.0 | 1773.0 | 852.0 | 747.0 | 746.0 | 604.0 | 528.0 | 532.0 | 624.0 | 632.0 | 512.0 | 472.0 | 571.0 | 518.0 | 459.0 | 446.0 |
| new | 7846.0 | 8476.0 | 7248.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| return | 0.0 | 0.0 | 595.0 | 1049.0 | 1362.0 | 1592.0 | 1434.0 | 1168.0 | 1211.0 | 1307.0 | 1404.0 | 1232.0 | 1025.0 | 1079.0 | 1489.0 | 919.0 | 1029.0 | 1060.0 |
| unactive | 0.0 | 6689.0 | 14046.0 | 20748.0 | 21356.0 | 21231.0 | 21390.0 | 21798.0 | 21831.0 | 21731.0 | 21542.0 | 21706.0 | 22033.0 | 22019.0 | 21510.0 | 22133.0 | 22082.0 | 22064.0 |
| unreg | 15724.0 | 7248.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
In [100]:
#进行转置在进行查看
pivoted_status.apply(lambda x:pd.value_counts(x)).fillna(0).T
Out[100]:
| | active | new | return | unactive | unreg |
| ---------: | -----: | -----: | -----: | -------: | ------: |
| month | | | | | |
| 1997-01-01 | 0.0 | 7846.0 | 0.0 | 0.0 | 15724.0 |
| 1997-02-01 | 1157.0 | 8476.0 | 0.0 | 6689.0 | 7248.0 |
| 1997-03-01 | 1681.0 | 7248.0 | 595.0 | 14046.0 | 0.0 |
| 1997-04-01 | 1773.0 | 0.0 | 1049.0 | 20748.0 | 0.0 |
| 1997-05-01 | 852.0 | 0.0 | 1362.0 | 21356.0 | 0.0 |
| 1997-06-01 | 747.0 | 0.0 | 1592.0 | 21231.0 | 0.0 |
| 1997-07-01 | 746.0 | 0.0 | 1434.0 | 21390.0 | 0.0 |
| 1997-08-01 | 604.0 | 0.0 | 1168.0 | 21798.0 | 0.0 |
| 1997-09-01 | 528.0 | 0.0 | 1211.0 | 21831.0 | 0.0 |
| 1997-10-01 | 532.0 | 0.0 | 1307.0 | 21731.0 | 0.0 |
| 1997-11-01 | 624.0 | 0.0 | 1404.0 | 21542.0 | 0.0 |
| 1997-12-01 | 632.0 | 0.0 | 1232.0 | 21706.0 | 0.0 |
| 1998-01-01 | 512.0 | 0.0 | 1025.0 | 22033.0 | 0.0 |
| 1998-02-01 | 472.0 | 0.0 | 1079.0 | 22019.0 | 0.0 |
| 1998-03-01 | 571.0 | 0.0 | 1489.0 | 21510.0 | 0.0 |
| 1998-04-01 | 518.0 | 0.0 | 919.0 | 22133.0 | 0.0 |
| 1998-05-01 | 459.0 | 0.0 | 1029.0 | 22082.0 | 0.0 |
0 | 0.0 | 1362.0 | 21356.0 | 0.0 |
| 1997-06-01 | 747.0 | 0.0 | 1592.0 | 21231.0 | 0.0 |
| 1997-07-01 | 746.0 | 0.0 | 1434.0 | 21390.0 | 0.0 |
| 1997-08-01 | 604.0 | 0.0 | 1168.0 | 21798.0 | 0.0 |
| 1997-09-01 | 528.0 | 0.0 | 1211.0 | 21831.0 | 0.0 |
| 1997-10-01 | 532.0 | 0.0 | 1307.0 | 21731.0 | 0.0 |
| 1997-11-01 | 624.0 | 0.0 | 1404.0 | 21542.0 | 0.0 |
| 1997-12-01 | 632.0 | 0.0 | 1232.0 | 21706.0 | 0.0 |
| 1998-01-01 | 512.0 | 0.0 | 1025.0 | 22033.0 | 0.0 |
| 1998-02-01 | 472.0 | 0.0 | 1079.0 | 22019.0 | 0.0 |
| 1998-03-01 | 571.0 | 0.0 | 1489.0 | 21510.0 | 0.0 |
| 1998-04-01 | 518.0 | 0.0 | 919.0 | 22133.0 | 0.0 |
| 1998-05-01 | 459.0 | 0.0 | 1029.0 | 22082.0 | 0.0 |
| 1998-06-01 | 446.0 | 0.0 | 1060.0 | 22064.0 | 0.0 |