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

