Pandas SeriesGroupBy无tolist属性报错 分组统计stroke列计数问题
问题原因说明
你的原有代码写法是错误的,报错触发原因如下:
- 分组逻辑完全颠倒:需求是按
Residence_type列的不同值分组统计stroke=1的数量,原代码错误使用stroke字段作为groupby的分组键,和需求逻辑不符 - 方法调用对象错误:
tolist()是普通Pandas Series的方法,data.groupby('stroke')['Residence_type']返回的是SeriesGroupBy分组对象,该对象没有tolist()属性,直接调用就会抛出你遇到的AttributeError - 统计逻辑冗余:就算绕过前面的报错,把分组对象转成普通对象再调
tolist().count(1)的思路也完全不符合Pandas的常规用法,效率低且容易出其他错误。
正确实现代码
你的需求可以直接通过Pandas内置的分组聚合实现,不需要转列表操作:
注意:示例数据中
stroke列实际列名为首字母大写的Stroke,代码中请和你自身数据的实际列名保持一致
# 方法1:利用0/1列求和直接得到每组中stroke=1的总数(最简洁高效) group_stroke_cnt = data.groupby('Residence_type')['stroke'].sum() # 计算两个分组的数量差值,需要绝对值可以套abs() count_diff = group_stroke_cnt['Urban'] - group_stroke_cnt['Rural'] # 方法2:先筛选stroke=1的记录再分组计数,逻辑更直观 group_stroke_cnt = data[data['stroke'] == 1].groupby('Residence_type')['stroke'].count() count_diff = group_stroke_cnt['Urban'] - group_stroke_cnt['Rural']
对照你给出的示例数据计算:
- Rural分组下stroke=1的记录共3条
- Urban分组下stroke=1的记录共2条
- 最终差值为
2-3 = -1,如果取绝对值则为1。
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

