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

Pandas groupby按Neighbourhood分组统计No-show列Yes/No计数问题

问题原因

调用.sum()得到NoNoYesNo类字符串拼接结果,是因为No-show列为字符串类型,Pandas对字符串列执行sum操作时默认做逐元素拼接,无法实现计数效果。
本次统计仅需Neighbourhood、No-show两个字段,提前筛选列可以避免原数据集其他冗余列干扰,以下是基于Pandas 1.4.2、Python 3.9.12环境的可运行实现方案:

实现方案

方案1:groupby 搭配 value_counts(推荐,严格符合groupby调用要求)

链式调用即可直接得到分组计数结果,输出为适配绘图的宽表格式:

# 先筛选需要的两列,再分组统计
count_df = df[['Neighbourhood', 'No-show']].groupby('Neighbourhood')['No-show'].value_counts().unstack(fill_value=0)

针对给出的示例数据,运行后输出结果如下:

No-show             No  Yes
Neighbourhood              
JARDIM DA PENHA      2    1
MARIA ORTIZ          1    2
MATA DA PRAIA        1    1
PONTAL DE CAMBURI    2    0

代码说明:

  • value_counts()会自动统计每个分组下No-show列不同取值的出现次数
  • unstack(fill_value=0)会把行索引上的Yes/No取值转为单独的列,没有对应取值的分组自动填充0,无需额外处理空值,可直接传入绘图接口。

方案2:分组后条件聚合(逻辑直观易读)

如果需要自定义聚合逻辑,可以先把字符串取值转为布尔值再分组求和:

count_df = df[['Neighbourhood', 'No-show']].assign(
    No = lambda x: (x['No-show'] == 'No').astype(int),
    Yes = lambda x: (x['No-show'] == 'Yes').astype(int)
).groupby('Neighbourhood')[['No', 'Yes']].sum()

运行后得到的结果和方案1完全一致。

方案3:交叉表快速统计(写法最简)

如果不强制要求走groupby链式调用,用Pandas内置的交叉表接口可以一行得到结果:

import pandas as pd
count_df = pd.crosstab(df['Neighbourhood'], df['No-show'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:09:20