Pandas如何逐行比较DataFrame两列内容并输出指定列数据
解决方案
df['person-name'].equals(df['new-person'])方法仅返回单个布尔值,作用是校验两个Series整体的索引、值是否完全一致,无法生成逐行布尔筛选掩码,因此无法实现行级匹配筛选的效果。
要匹配「姓名分词顺序不同但指向同一实体」的记录,核心判断逻辑为:将两列的姓名字符串按空格拆分为分词列表,对分词列表排序后比对是否完全一致——顺序颠倒的姓名拆分排序后结果完全相同,可以被准确识别。
基础实现代码
# 生成逐行匹配的布尔掩码 match_mask = ( df["person-name"].str.split().apply(sorted) == df["new-person"].str.split().apply(sorted) ) # 筛选匹配行,仅保留指定4列 result = df.loc[match_mask, ["identifier", "person-name", "new-identifier", "new-person"]]
场景适配优化
如果数据中存在姓名大小写不统一的情况(例如Sidney Crosby和crosby sidney),可以先统一转为小写再做拆分匹配,避免漏判:
match_mask = ( df["person-name"].str.lower().str.split().apply(sorted) == df["new-person"].str.lower().str.split().apply(sorted) )
注意事项
- 列名包含
-等特殊符号时,必须使用df["列名"]的方括号语法访问列,不能使用df.列名的点访问语法,否则会被Python识别为减法运算,触发语法错误。 - 上述逻辑默认姓名以空格作为分词分隔符,如果数据中存在多空格、特殊标点分隔姓名、带中间名的场景,可以先对姓名字段做针对性清洗,再执行匹配逻辑。
内容的提问来源于stack exchange,提问作者learner22
相关产品推荐
相关产品推荐

