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

Pandas布尔索引如何使用column变量与列列表筛选低评分记录

问题核心

你需要筛选三类条件同时满足的客户数据:

  • 客户类型为Disloyal
  • 年龄在30-40岁区间
  • 满意度为Not Satisfied(即0-5分评分体系下得分≤2)
    同时统计各评分维度的分值分布,现有代码存在三个明显错误:
  1. 写的for column in df[ranked_cols]没有配套执行逻辑,循环结束后column只会固定为列表最后一个列名,无法遍历所有评分列
  2. 直接用sub[(sub[ranked_cols] <= 2)]做多列布尔筛选时,没有指定行聚合逻辑,pandas会返回全NaN的无效结果
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:21:30