如何在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
相关产品推荐
相关产品推荐

