如何用Pandas生成年龄缺失值的性别双向对比表?
如何用Pandas分析不同性别群体的Age缺失值分布一致性?
嘿,这问题我熟,我来给你一步步拆解怎么用Pandas搞定这个缺失值分布对比的需求~
首先先还原你的示例数据,我们可以先把它构建成Pandas DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'ID': [1, 2, 3, 4, 5], 'Age': [20, 40, 40, np.nan, 18], 'Sex': [np.nan, 'F', 'M', 'M', np.nan] })
你的需求是对比Male和Female群体中,Age字段有值/缺失的比例,生成类似双向对比表的结果。下面是具体实现步骤:
步骤1:筛选有效样本
原数据里有部分Sex字段为空的行,我们只关注明确标记为Male(M)和Female(F)的样本,先把这些行筛选出来:
filtered_df = df[df['Sex'].isin(['M', 'F'])].copy()
步骤2:标记Age是否存在
新增一列来标记每行的Age是否非空(也就是有没有有效值):
filtered_df['Has Age'] = filtered_df['Age'].notna()
步骤3:生成交叉计数表
用pd.crosstab来统计每个性别下,Age有值/缺失的数量:
cross_tab = pd.crosstab(filtered_df['Sex'], filtered_df['Has Age'], margins=False) # 把默认的True/False列名改成你需要的名称 cross_tab.columns = ['Null age', 'Has Age']
步骤4:计算比例并调整格式
把计数转换成每行的比例(也就是每个性别内部的占比),再调整索引和列的顺序,让结果和你期望的一致:
# 按行归一化,计算每个性别下的比例 proportion_tab = cross_tab.div(cross_tab.sum(axis=1), axis=0) # 把行索引改成你要的Male/Female proportion_tab.index = ['Male', 'Female'] # 调整列的顺序为Has Age在前,Null age在后 proportion_tab = proportion_tab[['Has Age', 'Null age']]
最终结果
运行完上面的代码后,打印proportion_tab就能得到你想要的双向对比表:
Has Age Null age Male 0.5 0.5 Female 1.0 0.0
这个结果对应你的数据:Male群体有2个样本,其中一半有Age值、一半缺失;Female群体只有1个样本,Age是完整的,所以缺失比例为0。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

