使用Pandas校验多列姓名字段是否存在于全名字段并统计匹配数
Pandas 逐行校验名字字段并统计符合记录数实现逻辑
校验规则说明
逐行匹配满足以下全部条件的记录,计入有效统计:
- 该行
FIRST_NAME、LAST_NAME(若存在中间名字段则一并纳入校验)中至少有1个非空值 - 所有非空的名字字段值,均能在同一行的
FULL_NAME字段中完整匹配存在
测试数据构造
先构建与题给样例完全一致的测试DataFrame:
import pandas as pd # 构造样例数据 data = { "FULL_NAME": ["Joe Bloggs", "Greg", "Larson", "Emily Sun", "Clara Zen", "Justin Tim"], "FIRST_NAME": ["Joe", None, "Larson", None, None, "Justin"], "LAST_NAME": ["Bloggs", "Greg", None, None, None, "Tim"] } df = pd.DataFrame(data)
逐行校验代码实现
- 定义单行校验函数,支持灵活扩展校验的名字列(如需加入中间名字段,仅需修改校验列列表即可):
def validate_row(row, check_column_list): # 提取当前行所有待校验字段的非空值 non_empty_name_list = row[check_column_list].dropna().tolist() # 无有效非空名字直接判定为无效 if not non_empty_name_list: return False # 校验所有非空名字是否都在FULL_NAME中 full_name_content = row["FULL_NAME"] return all(name in full_name_content for name in non_empty_name_list)
- 执行逐行校验并统计有效记录数:
# 指定需要参与校验的名字列,有中间名列时可追加到列表中 check_cols = ["FIRST_NAME", "LAST_NAME"] # 逐行生成校验结果 df["is_valid"] = df.apply(lambda x: validate_row(x, check_cols), axis=1) # 统计有效记录总数 valid_total = df["is_valid"].sum()
结果与注意事项
- 执行上述代码后,
valid_total的输出值为4,与预期统计结果完全一致。
可选调整:若需忽略大小写匹配,可在校验前将
full_name_content和每个name统一转为小写/大写后再做包含判断。
注意:若实际业务数据中空值为空白字符串格式,需先执行df.replace("", pd.NA, inplace=True)完成空值统一转换,避免校验逻辑误判。
内容的提问来源于stack exchange,提问作者Girl007
相关产品推荐
相关产品推荐

