如何使用pandas聚合分组指标并绘制泰坦尼克号幸存者年龄分布饼图
问题原因
- 泰坦尼克数据集的
Age字段存在177条缺失值,groupby操作默认会自动过滤含有空值的分组,这部分数据直接被排除在统计之外,导致最终统计的总人数远低于891 - 你在完成年龄分箱后没有再次按年龄组、存活状态两个维度做聚合统计,当前输出的142行是不同年龄值+存活状态的组合数,不是你需要的年龄维度的统计结果
修正后代码
import pandas as pd import seaborn as sns # 加载泰坦尼克测试数据集 df_t = sns.load_dataset('titanic') # 统一列名首字母大写 df_t.columns = df_t.columns.str.title() def get_num_people_by_age_category(df): # 年龄分箱,包含边界值避免0岁、100岁等极端值被归为NaN df["age_group"] = pd.cut( x=df['Age'], bins=[0,18,60,100], labels=["青少年", "中年", "老年"], include_lowest=True ) # 可选操作:将年龄缺失的样本单独归为未知组,避免数据丢失 df["age_group"] = df["age_group"].cat.add_categories("年龄未知").fillna("年龄未知") # 按年龄组、存活状态聚合统计人数 group_result = df.groupby(['age_group', 'Survived'], as_index=False).size() return group_result # 调用函数获取统计结果 stat_df = get_num_people_by_age_category(df_t) print(stat_df) # 提取幸存者各年龄组人数,可直接用于绘制饼图 survived_stat = stat_df[stat_df["Survived"] == 1]
补充说明
- 如果不需要保留年龄缺失的样本,可在分箱前执行
df = df.dropna(subset=["Age"])过滤空值,统计结果总人数会和Age列非空的样本数一致 - 聚合后的
size字段就是对应分组的人数,直接取该字段和age_group字段即可绘制饼图
内容的提问来源于stack exchange,提问作者mert
相关产品推荐
相关产品推荐

