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

在Pandas中生成group_ID列:解决DOB缺失时返回NaN的问题

解决Pandas按规则生成group_ID的问题

问题分析

你当前的代码存在两个核心问题:

  • 使用or拼接分组条件是错误逻辑,Python中A or B会返回第一个布尔值为真的对象,而非合并两组分组规则;
  • 直接以包含NaN的dob列分组时,Pandas会自动排除含缺失值的行,导致这些行的GID被赋值为NaN,不符合需求。

解决方案

核心思路是将dob的缺失值统一替换为固定标识,确保相同姓名前缀+(相同日期/缺失)的行能被分到同一组。具体步骤如下:

  1. 用统一字符串填充dob列的缺失值,让缺失值成为可被分组的有效标识;
  2. 基于姓名前缀、处理后的出生日期分组,使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:53:25