如何为客户留存数据集创建符合需求的透视表或聚合表?
按手机品牌统计客户流失与留存情况
嘿,我来帮你搞定这个统计需求!先理清楚你的数据和目标:
你有这样的原始DataFrame:
import pandas as pd df = pd.DataFrame({"Client":[0,1,0,1,0], "Phone" : ["IPhone", "Huawei", "IPhone", "Samsung", "Huawei"]})
执行print(df)后输出:
Client Phone 0 0 IPhone 1 1 Huawei 2 0 IPhone 3 1 Samsung 4 0 Huawei
其中Client列的0代表客户流失,1代表客户留存,我们需要统计每个手机品牌对应的流失客户数、留存客户数以及客户总数。
方案1:用groupby+agg自定义统计
这种方式灵活性拉满,能直接定义每个统计项的逻辑:
# 按手机品牌分组,分别统计流失、留存人数,再计算总数 result = df.groupby('Phone')['Client'].agg( 流失客户数=lambda x: (x == 0).sum(), 留存客户数=lambda x: (x == 1).sum(), 客户总数='count' ).reset_index() print(result)
运行后得到的结果是:
Phone 流失客户数 留存客户数 客户总数 0 Huawei 1 1 2 1 IPhone 2 0 2 2 Samsung 0 1 1
方案2:用pd.crosstab快速生成交叉统计
如果是这种二元分类的统计,用crosstab会更简洁:
# 生成品牌和客户状态的交叉统计表 cross_tab = pd.crosstab(df['Phone'], df['Client']) # 重命名列名,让结果更直观 cross_tab = cross_tab.rename(columns={0: '流失客户数', 1: '留存客户数'}) # 添加客户总数列,每行求和即可 cross_tab['客户总数'] = cross_tab.sum(axis=1) # 把品牌从索引转为普通列 cross_tab = cross_tab.reset_index() print(cross_tab)
这个代码会输出和方案1完全一致的结果。
两种方案的小区别:
- 方案1适合后续需要加更多统计项(比如流失率)的场景,想加什么直接在
agg里加就行; - 方案2是专门处理分类变量交叉统计的工具,代码更短,适合这种简单的二元分类统计需求。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

