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

Pandas中对value_counts结果按分组变量求和count列并保留变量名

实现方案

你只需要在现有统计逻辑的基础上,按特征维度对count列做分组求和即可,具体操作如下:

  • 首先将原有的melt统计逻辑结果赋值给prod变量,这步和你现有操作一致:
ranked_cols = [
    "Design",
    "Food",
    "Wi-Fi",
    "Service",
]

# 筛选符合人口统计条件的用户
sub = df[
    (df["Customer Type"] == "Disloyal")
    & (df["Satisfaction"] == "Not Satisfied")
    & df["Age"].between(30, 40)
]

# 生成评分明细统计结果
prod = (
    sub.melt(value_vars=ranked_cols)
    .groupby("variable")
    .value_counts()
    .to_frame()
    .reset_index()
    .rename(columns={"value": "rating", 0: "count"})
)
  • 如果需要筛选指定评分(比如评分等于2的场景),先做子集筛选,再按特征变量分组对count列求和:
# 筛选指定评分,不需要筛选特定评分可以跳过这行
prod_selected = prod[prod.rating == 2]

# 按特征分组求和
feature_total = prod_selected.groupby("variable", as_index=False)["count"].sum()
  • 最后按要求的特征名 数值格式逐行输出即可:
for _, row in feature_total.iterrows():
    print(f"{row['variable']}  {row['count']}")

效果示例

基于你给出的统计输出样例,不做评分筛选时的输出结果为:

Design  8
Food  1
Service  1
Wi-Fi  3

如果筛选rating == 2,输出结果为:

Design  5
Wi-Fi  3

简化写法

你也可以不用生成中间的count明细,直接通过链式操作一步得到结果:

(
    sub.melt(value_vars=ranked_cols, var_name="variable", value_name="rating")
    .query("rating == 2") # 不需要筛选评分就删除该行
    .groupby("variable")
    .size()
    .reset_index(name="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.29 23:39:14