基于单元格值填充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能拆分出国家、出生年份),咱们可以基于这个特性做交叉验证:
- 先解析
code里的信息到临时列,和现有字段做对比 - 对每个字段(country、yob、id),优先取非空的一致值;如果出现冲突,标记为待人工审核
- 最后合并成一条完整的有效数据(或标记冲突的待审核数据)
给你写个可直接复用的处理函数:
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
相关产品推荐
相关产品推荐

