使用布尔索引或groupby统计特定客户数并识别低评分产品
基于Pandas的客户数据统计实现方案
该场景优先使用布尔索引完成筛选统计,逻辑直观且执行效率更高,具体实现步骤如下:
1. 统计符合多条件的客户总数量
所有筛选条件取交集(同时满足),使用&连接各单条件判断表达式,注意每个单条件需用括号包裹,避免Python运算符优先级导致的逻辑错误。
各筛选条件对应代码逻辑:
- 客户类别为非忠诚:
df['Customer Cat'] == 'Disloyal' - 年龄在30-40岁闭区间:
df['Age'].between(30, 40) - 满意度为不满意:
df['Satisfaction'] == 'Dissatisfied' - Prod A Rank评分在0-2区间:
df['Prod A Rank'].between(0, 2) - Prod B Rank评分在0-2区间:
df['Prod B Rank'].between(0, 2)
完整实现代码:
import pandas as pd # 加载数据集,此处用题目给出的示例数据做演示 df = pd.DataFrame( [ ["Disloyal", 28, "Dissatisfied", 1, 2], ["Loyal", 30, "Satisfied", 3, 5], ["Disloyal", 36, "Dissatisfied", 0, 2] ], columns=["Customer Cat", "Age", "Satisfaction", "Prod A Rank", "Prod B Rank"] ) # 生成筛选掩码 filter_mask = ( (df["Customer Cat"] == "Disloyal") & (df["Age"].between(30, 40)) & (df["Satisfaction"] == "Dissatisfied") & (df["Prod A Rank"].between(0, 2)) & (df["Prod B Rank"].between(0, 2)) ) # 计算符合条件的客户总数(布尔序列True等价于1,求和即为符合条件的行数) target_cust_num = filter_mask.sum()
针对题目给出的示例数据集,运行后得到符合条件的客户数为1,对应年龄36岁的非忠诚不满意客户。
2. 识别目标客户评分≤2的所有产品
先通过掩码提取符合条件的目标客户子集,再判断两个产品列的评分是否满足≤2的要求,汇总去重后即可得到结果:
# 提取目标客户子集 target_cust_df = df[filter_mask] low_score_prod = [] # 遍历子集逐行判断产品评分 for _, row in target_cust_df.iterrows(): if row["Prod A Rank"] <= 2: low_score_prod.append("Prod A") if row["Prod B Rank"] <= 2: low_score_prod.append("Prod B") # 去重得到最终产品列表 low_score_prod = list(set(low_score_prod))
针对示例数据集,最终得到的低评分产品为["Prod A", "Prod B"],该客户对两款产品的评分分别为0、2,均满足≤2的要求。
内容的提问来源于stack exchange,提问作者Edison
相关产品推荐
相关产品推荐

