Pandas:按多条件匹配分组行更新性别推断列
解决方法
要生成你需要的mask3,核心是统计每个家庭中「Status为head且Gender为undetermined」的个体数量,判断是否等于1。下面是具体实现步骤:
1. 计算每个家庭的未确定性别户主数量
用groupby + transform可以直接在原DataFrame上生成对应家庭的计数,不用额外合并:
# 为每行添加对应家庭的未确定性别户主计数 df['head_undetermined_count'] = df.groupby('FamilyID').transform( lambda group: ((group['Status'] == 'head') & (group['Gender'] == 'undetermined')).sum() )
2. 构建三个条件掩码
结合你已有的mask1和mask2,加上新的mask3:
# mask1:筛选属于有妻子的家庭的行 mask1 = df['FamilyID'].isin(df[df['Status'] == 'wife']['FamilyID']) # mask2:筛选是户主且性别未确定的行 mask2 = (df['Status'] == 'head') & (df['Gender'] == 'undetermined') # mask3:筛选对应家庭仅有一位未确定性别户主的行 mask3 = df['head_undetermined_count'] == 1
3. 生成Gender_Inferred列
只有同时满足三个条件的行,才将推断性别设为male,其余情况保留原Gender值:
# 创建推断列 df['Gender_Inferred'] = df['Gender'].where(~(mask1 & mask2 & mask3), 'male') # 可选:清理临时生成的计数列 df.drop('head_undetermined_count', axis=1, inplace=True)
这样就能完全匹配你的需求:仅当家庭存在妻子、仅有一位未确定性别的户主时,该户主的推断性别为male,其余情况沿用原始性别。
内容的提问来源于stack exchange,提问作者jvb
相关产品推荐
相关产品推荐

