You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为客户留存数据集创建符合需求的透视表或聚合表?

按手机品牌统计客户流失与留存情况

嘿,我来帮你搞定这个统计需求!先理清楚你的数据和目标:

你有这样的原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:43:27