如何简化泰坦尼克数据集按舱位计算生存百分比的实现?
简化泰坦尼克数据集舱位生存百分比计算流程
问题描述
我有经典的泰坦尼克数据集,示例数据如下:
fr1 = pd.DataFrame({ "class": ["1", "2", "2"], "survived": [0, 1, 1]})
我需要计算每个舱位的人员生存百分比,目前的实现是先通过掩码拆分数据,再分组统计:
# 注:原代码存在列名大小写不一致问题,此处修正以匹配示例数据的列名 fr2 = fr1[fr1["survived"] == 0] fr2 = fr2.groupby("class", as_index=False)["survived"].agg(["count"]) fr3 = fr1[fr1["survived"] == 1] fr3 = fr3.groupby("class", as_index=False)["survived"].agg(["count"])
之后合并结果并创建百分比列:
merged = pd.merge(fr2,fr3,left_index=True,right_index=True) merged.columns = "Survived Died".split() merged["Percentage"] = merged["Survived"] / (len(fr1))*100
请问怎么简化这个流程?
简化实现方案
直接利用pandas的分组聚合、透视表或交叉表功能,无需拆分合并数据集,一步完成统计计算,以下是几种实用方法:
方法1:用groupby+value_counts快速算占比
如果要计算每组舱位内的生存百分比:
# 按舱位分组,统计生存/死亡的占比,转成宽表格式 survival_stats = fr1.groupby('class')['survived'].value_counts(normalize=True).unstack(fill_value=0) # 重命名列并转成百分比 survival_stats = survival_stats.rename(columns={1: 'Survived_Pct', 0: 'Died_Pct'}) * 100
如果要计算相对总数据集的生存百分比:
# 按舱位统计生存人数、总人数 class_stats = fr1.groupby('class')['survived'].agg(['sum', 'count']) # 计算百分比 class_stats['Survived_Pct'] = (class_stats['sum'] / len(fr1)) * 100 class_stats = class_stats.rename(columns={'sum': 'Survived_Count', 'count': 'Total_Count'})
方法2:用pivot_table生成透视表一步到位
# 生成舱位×生存状态的透视表,统计人数 pivot_stats = fr1.pivot_table( index='class', columns='survived', aggfunc='size', fill_value=0 ) # 重命名列并计算总人数占比 pivot_stats.columns = ['Died_Count', 'Survived_Count'] pivot_stats['Survived_Pct'] = (pivot_stats['Survived_Count'] / len(fr1)) * 100
方法3:用crosstab快速生成交叉统计
# 生成舱位与生存状态的交叉表 cross_stats = pd.crosstab(fr1['class'], fr1['survived'], fill_value=0) # 重命名列并计算百分比 cross_stats.columns = ['Died_Count', 'Survived_Count'] cross_stats['Survived_Pct'] = (cross_stats['Survived_Count'] / len(fr1)) * 100
这些方法都省去了拆分、合并数据集的步骤,代码更简洁,也避免了原代码中列名不一致的潜在错误。
内容的提问来源于stack exchange,提问作者Josue Medina
相关产品推荐
相关产品推荐

