Pandas布尔索引如何使用column变量与列列表筛选低评分记录
问题核心
你需要筛选三类条件同时满足的客户数据:
- 客户类型为
Disloyal - 年龄在30-40岁区间
- 满意度为
Not Satisfied(即0-5分评分体系下得分≤2)
同时统计各评分维度的分值分布,现有代码存在三个明显错误:
- 写的
for column in df[ranked_cols]没有配套执行逻辑,循环结束后column只会固定为列表最后一个列名,无法遍历所有评分列 - 直接用
sub[(sub[ranked_cols] <= 2)]做多列布尔筛选时,没有指定行聚合逻辑,pandas会返回全NaN的无效结果 ranked_cols错误混入了Distance列,该列是距离数值,不属于0-5分的评分维度,需要先剔除
正确实现代码
基础筛选逻辑
首先修正评分列列表,完成客户属性子集筛选:
# 剔除非评分列Distance ranked_cols = ['Design', 'Food', 'Wi-Fi', 'Service'] sub = df[ (df["Customer Type"] == "Disloyal") & (df["Satisfaction"] == "Not Satisfied") & df["Age"].between(30, 40) ]
布尔表达式正确写法
如果要统计「任意一个评分项得分≤2」的客户总数,需要对多列判断结果按行做聚合,用.any(axis=1)指定只要任意一列满足条件就匹配:
# 多列布尔判断的正确写法 match_total = sub[(sub[ranked_cols] <= 2).any(axis=1)].shape[0]
如果你确实要在循环中使用column变量做单维度判断,必须把所有依赖column的逻辑放到循环缩进块内,示例:
col_stats = [] for column in ranked_cols: # 循环内column会依次取到每个评分列名,直接传入做单列布尔判断即可 low_score_cnt = sub[sub[column] <= 2].shape[0] col_stats.append({"dimension": column, "low_score_count": low_score_cnt})
分维度分值统计
你写的melt统计逻辑不需要依赖循环的column变量,直接传入修正后的评分列列表即可得到各维度的分值计数结果:
score_dist = ( sub.melt(value_vars=ranked_cols) .groupby("variable") .value_counts() .to_frame() .reset_index() .rename(columns={0: "count"}) )
内容的提问来源于stack exchange,提问作者Edison
相关产品推荐
相关产品推荐

