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

Pandas使用groupby后,如何计算列中负数占比

错误原因分析

  • 第一行代码逻辑错误:df.groupby('name')(['score'] < 0) 里的 ['score'] 是列表类型,拿列表和整数0做比较自然会触发类型错误,这就是你遇到 TypeError: '<' not supported between instances of 'list' and 'int' 的核心原因。
  • 第二行代码列名写错:原DataFrame的列是score,你写成了scores,执行时会报列不存在的错误。

正确解法

方法一:一步到位实现需求

利用布尔值在数值计算中True=1、False=0的特性,直接分组计算负数占比并格式化:

# 计算每组负数占比,转成百分比格式并整理成目标DataFrame
result = (
    (df['score'] < 0)
    .groupby(df['name'])
    .mean()
    .mul(100)
    .round(0)
    .astype(str) + '%'
).reset_index(name='negative_score_percent')

print(result)

执行后输出:

name negative_score_percent
0   George                    0%
1     John                   50%
2     Mary                   50%
3     Paul                  100%

方法二:按你最初的分步思路修正

如果想保留分步计算的逻辑,修正后的代码如下:

# 1. 计算每组的负数数量
negative_counts = (df['score'] < 0).groupby(df['name']).sum()
# 2. 计算每组的总分数数量(修正列名)
total_counts = df.groupby('name')['score'].count()
# 3. 计算占比并格式化
percent = (negative_counts / total_counts).mul(100).round(0).astype(str) + '%'
# 4. 整理成目标结构
result = percent.reset_index(name='negative_score_percent')

关键逻辑说明

  • df['score'] < 0 生成布尔Series,标记每行分数是否为负
  • groupby(df['name']).mean() 直接计算每组布尔值的平均值,等价于「负数数量/总数量」
  • .mul(100).round(0) 将占比转为百分比并取整,最后拼接%变成字符串格式

内容的提问来源于stack exchange,提问作者Emmett C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:50:00