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

如何在Python中结合求和聚合实现If/else语句进行客户分群

解决客户分群的双条件判断问题

你当前的代码只处理了单条记录的支付金额,没法兼顾「全ID累计总和」和「所有月份都达标」这两个条件,按下面的步骤改就能实现需求:

步骤1:计算每个客户的关键聚合指标

用transform方法把每个ID的累计支付总和、最小月支付金额直接映射回原表格的每一行,这样每一行都能拿到该客户的全局指标:

# 计算每个ID的累计支付总和,映射到每一行
df['Total_Revenue'] = df.groupby('ID')['Revenue'].transform('sum')
# 计算每个ID的最小月支付金额(确保所有月份都≥50,只要最小值达标就行)
df['Min_Monthly_Revenue'] = df.groupby('ID')['Revenue'].transform('min')

步骤2:双条件判断分群

直接用numpy.where做判断,逻辑清晰且高效:

import numpy as np

# 同时满足「每月支付≥50」和「累计支付>80」才标记为VIP,否则是Middle
df['Segment'] = np.where(
    (df['Min_Monthly_Revenue'] >= 50) & (df['Total_Revenue'] > 80),
    'VIP',
    'Middle'
)

逻辑说明

  • transform配合groupby,能自动把聚合结果和原表格的每一行对应,不用额外做合并操作
  • 用最小月支付金额判断「每月都≥50」是最优方式——只要最小值达标,该客户所有月份的支付肯定都满足要求
  • 双条件用&连接,必须同时满足才会被划为VIP

替代方案:分组后用自定义函数处理

如果你更习惯用自定义函数的写法,也可以按ID分组后批量处理:

def assign_segment(group):
    total_rev = group['Revenue'].sum()
    min_monthly_rev = group['Revenue'].min()
    group['Segment'] = 'VIP' if (min_monthly_rev >=50 and total_rev >80) else 'Middle'
    return group

df = df.groupby('ID').apply(assign_segment).reset_index(drop=True)

内容的提问来源于stack exchange,提问作者Nikol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:27:10