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

