Pandas拆分姓名统计姓氏频次(家庭规模):如何处理NaN值?
Pandas姓名拆分与姓氏统计问题解决方案
一、修正现有groupby方法,解决NaN行的FamilySize问题
首先注意你的示例中Name列的'nan'是字符串类型,不是Pandas标准缺失值,先将其转换为真正的缺失值,后续处理更规范:
import pandas as pd import numpy as np # 初始化DataFrame,将字符串'nan'替换为标准缺失值 df = pd.DataFrame( {'Name': ['Hilary Clinton', 'Bob Dole', 'nan', 'Chelsea Clinton', 'Eizabeth Dole', 'nan'], 'State': ['New York', 'Kansas', 'Vermont', 'California', 'Kansas', 'California']} ).replace({'Name': {'nan': np.nan}}) # 拆分提取姓氏,缺失值会自动保留 df['LastName'] = df['Name'].str.split().str[-1] # 生成FamilySize,同时将LastName为缺失值的行设为NaN df['FamilySize'] = df.groupby('LastName')['LastName'].transform('count') df['FamilySize'] = df['FamilySize'].mask(df['LastName'].isna())
处理后,原姓名缺失的行,其FamilySize会显示为NaN,符合需求。
二、其他统计姓氏出现次数的方法
方法1:使用value_counts() + map()
先统计各姓氏的出现次数,再通过映射赋值:
# 统计姓氏出现次数,自动排除缺失值 last_name_counts = df['LastName'].value_counts(dropna=True) # 映射到原表,缺失值对应的FamilySize自动为NaN df['FamilySize'] = df['LastName'].map(last_name_counts)
方法2:使用merge()结合聚合结果
先生成姓氏统计的独立表,再合并回原DataFrame:
# 生成姓氏统计聚合表 count_df = df.dropna(subset=['LastName']).groupby('LastName').size().reset_index(name='FamilySize') # 左连接合并,缺失值行的FamilySize自动保留为NaN df = df.merge(count_df, on='LastName', how='left')
方法3:使用np.where结合transform
在统计时直接判断并处理缺失值:
df['FamilySize'] = np.where( df['LastName'].isna(), np.nan, df.groupby('LastName')['LastName'].transform('count') )
内容的提问来源于stack exchange,提问作者Kris L
相关产品推荐
相关产品推荐

