在Pandas中生成group_ID列:解决DOB缺失时返回NaN的问题
解决Pandas按规则生成group_ID的问题
问题分析
你当前的代码存在两个核心问题:
- 使用
or拼接分组条件是错误逻辑,Python中A or B会返回第一个布尔值为真的对象,而非合并两组分组规则; - 直接以包含
NaN的dob列分组时,Pandas会自动排除含缺失值的行,导致这些行的GID被赋值为NaN,不符合需求。
解决方案
核心思路是将dob的缺失值统一替换为固定标识,确保相同姓名前缀+(相同日期/缺失)的行能被分到同一组。具体步骤如下:
- 用统一字符串填充
dob列的缺失值,让缺失值成为可被分组的有效标识; - 基于姓名前缀、处理后的出生日期分组,使用
ngroup()生成连续分组ID。
示例代码
import pandas as pd # 构建示例数据 data = { 'Fname': ['PNRM', 'PNRM', 'PNRM', 'SMO', 'SMO'], 'Lname': ['ATPN', 'ATPN', 'ATPN', 'XTS', 'XTS'], 'dob': ['14-01-1950', pd.NA, pd.NA, '14-06-2001', pd.NA] } df = pd.DataFrame(data) # 填充dob缺失值为统一标识 df['processed_dob'] = df['dob'].fillna('MISSING') # 按规则分组生成group_ID(+1让ID从1开始,匹配示例) df['group_ID'] = df.groupby([ df['Fname'].str[:2], df['Lname'].str[:2], df['processed_dob'] ]).ngroup() + 1 # 清理临时列 df = df.drop('processed_dob', axis=1) print(df)
输出结果
Fname Lname dob group_ID 0 PNRM ATPN 14-01-1950 1 1 PNRM ATPN <NA> 1 2 PNRM ATPN <NA> 1 3 SMO XTS 14-06-2001 2 4 SMO XTS <NA> 2
内容的提问来源于stack exchange,提问作者Sonakshi
相关产品推荐
相关产品推荐

