从两列创建索引层次结构以映射客户保留

时间:2018-03-31 21:35:02

标签: python pandas indexing

我正在为工作执行流失分析,我一直在尝试根据现有数据框创建一个多索引数据框。

我目前有一个类似于此的Dataframe结构:

df.head(3)

CustomerID  Lifetime  Cohort  Monthly_Pay  Ltv_Rev  Sub   Pln_strt  pln Can
----------------------------------------------------------------------------
fgvghc        10     2010-5    14.99        150   2010-5  2010-5-3  2011-5-3
dhsdjk        2      2010-5    14.99        179   2010-5  2010-5-9  2010-7-8   
5uk0ez        3      2010-6    5.99         18    2010-6  2010-6-4  2010-8-2

我试图弄清楚每个队列在20个月内的流失。群组列是群组本身,而订阅列标记了保留总用户数的月份。示例如下:

                  Total_Users 
Cohort  Subscribe
-------------------------------
2010-5  2010-5        2
        2010-6        2
        2010-7        1
        ...

到目前为止,我一直在尝试:

grouped = df.groupby(['Cohort', 'Subscribe'])
grouped.agg({'CustomerID': pd.Series.nunique})

但这不起作用;它只是打印每个群组中的总用户数,而没有真正区分群组和订阅列:

                   Total_Users 
Cohort  Subscribe
-------------------------------
2010-5  2010-5        2
2010-6  2010-6        4
2010-7  2010-7        12 

我也尝试过:

    grouped = df.groupby(['Cohort', 'Subscribe'])['CustomerID'].size()

但是会在一系列内打印上述结果。

更新:我没有为了空间而发布我的实际数据帧,但现在我意识到我省略了可能重要的信息。我添加了计划开始日期和计划取消日期。

我认为每个群组的映射保留问题源于使用CustomerID的不正确方式,总客户生命周期以及开始和取消日期。

任何能够帮助新秀的人?            ... 作为参考,我一直以此为指导。 http://www.gregreda.com/2015/08/23/cohort-analysis-with-python/

1 个答案:

答案 0 :(得分:0)

您似乎需要使用size()

import pandas as pd

df = pd.DataFrame([['fgvghc', 10, '2010-5', 14.99, 150, '2010-5'],
                   ['dhsdjk', 12, '2010-5', 14.99, 179, '2010-5'],
                   ['akdsfj', 12, '2010-5', 14.99, 179, '2010-6'],
                   ['5uk0ez', 3, '2010-6', 5.99, 17.97, '2010-6']],
                  columns=['Customer_ID', 'Lifetime', 'Cohort',
                           'Monthly_Payment', 'Lifetime_Rev', 'Subscribed'])

res = df.groupby(['Cohort', 'Subscribed'])['Customer_ID'].size()

结果:

Cohort  Subscribed
2010-5  2010-5        2
        2010-6        1
2010-6  2010-6        1
Name: Customer_ID, dtype: int64