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

基于单元格值填充DataFrame缺失值及同名用户去重合并技术问询

针对你处理大型姓名列表去重、整合信息的需求,结合你给出的分组示例,我整理了一套实操性强的方案:

重复姓名列表的去重与信息整合方案

核心逻辑梳理

你提到的场景很典型:姓名唯一时用ffill/bfill补全空值即可,但姓名重复时必须结合字段关联性做校验——毕竟同名可能是同一人(信息分散在多行),也可能是不同人(需要区分)。咱们从你给的示例数据入手,一步步落地:

第一步:按姓名分组

首先把数据按name字段做分组,这是后续处理的基础。用Pandas实现的话代码如下:

import pandas as pd
# 假设你的数据存储在CSV文件中,读取数据
df = pd.read_csv("your_name_list.csv")
# 按姓名分组
name_groups = df.groupby("name")

第二步:区分分组类型处理

对每个分组做判断:

  • 如果分组只有1行(姓名唯一):直接用ffill+bfill补全所有空值
  • 如果分组有多行(姓名重复):针对code等关联字段做校验,再整合信息

第三步:重复姓名组的校验与整合(重点)

从你的示例看,code字段包含个人关键信息(比如USA19921111能拆分出国家、出生年份),咱们可以基于这个特性做交叉验证:

  1. 先解析code里的信息到临时列,和现有字段做对比
  2. 对每个字段(country、yob、id),优先取非空的一致值;如果出现冲突,标记为待人工审核
  3. 最后合并成一条完整的有效数据(或标记冲突的待审核数据)

给你写个可直接复用的处理函数:

def process_single_group(group):
    # 姓名唯一的组:直接填充空值
    if len(group) == 1:
        return group.ffill(axis=1).bfill(axis=1)
    # 姓名重复的组:做字段校验与整合
    else:
        # 解析code字段中的国家和出生年份(根据你的code格式调整正则)
        group["parsed_country"] = group["code"].str.extract(r"([A-Z]{3})")
        group["parsed_yob"] = group["code"].str.extract(r"(\d{4})").astype(float)
        
        # 校验并确定country字段值
        valid_country = group["country"].dropna().unique()
        parsed_country = group["parsed_country"].dropna().unique()
        if len(valid_country) == 1 and len(parsed_country) == 1 and valid_country[0] == parsed_country[0]:
            final_country = valid_country[0]
        else:
            final_country = "【待审核:国家字段冲突】"
        
        # 校验并确定yob字段值
        valid_yob = group["yob"].dropna().unique()
        parsed_yob = group["parsed_yob"].dropna().unique()
        if len(valid_yob) == 1 and len(parsed_yob) == 1 and valid_yob[0] == parsed_yob[0]:
            final_yob = valid_yob[0]
        else:
            final_yob = "【待审核:出生年份冲突】"
        
        # 处理id字段:取唯一非空值,多值则标记
        valid_id = group["id"].dropna().unique()
        final_id = valid_id[0] if len(valid_id) == 1 else "【待审核:ID多值】"
        
        # 处理code字段:保留与校验通过字段匹配的code,或保留所有非空值
        matched_codes = group[group["parsed_yob"] == final_yob]["code"].dropna().unique()
        final_code = matched_codes[0] if len(matched_codes) == 1 else ",".join(group["code"].dropna().unique())
        
        # 返回整合后的单行数据
        return pd.DataFrame({
            "name": [group["name"].iloc[0]],
            "code": [final_code],
            "id": [final_id],
            "country": [final_country],
            "yob": [final_yob]
        })

# 应用函数到所有分组,合并结果
final_result = name_groups.apply(process_single_group).reset_index(drop=True)

额外实操建议

  • 如果code的格式不固定,你可以调整正则表达式,或者根据实际业务规则写解析逻辑
  • 把标记为「待审核」的条目单独导出,手动确认后再处理,避免误合并不同人的数据
  • 预处理时统一姓名格式:比如把所有姓名转成小写、去除空格差异,避免因大小写/空格导致的假分组

内容的提问来源于stack exchange,提问作者moto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:33:53