You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:12:59