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

