Pandas数据帧间的完全字符串匹配实现问题
Pandas数据帧间的完全字符串匹配实现问题
老哥,我太懂你这种翻了一堆问题还是踩坑的崩溃感了!要实现这种完全字符串匹配其实没那么复杂,你之前大概率是不小心用了支持部分匹配的方法(比如str.contains()),咱们直接用Pandas原生的精确匹配方案就行,给你一步步说清楚:
首先先把你给出的两个数据帧用代码还原出来,方便你直接复现测试:
import pandas as pd # 构造你的DataFrame A df_a = pd.DataFrame({ 'ID': [1,2,3,4,5,6,7], 'Text': ['admin', 'Care', 'Office', 'Doctor', 'be', 'to', 'in'], 'score': [10.4, 2.0, 5.0, 0.5, 0.2, 0.9, 0.8] }) # 构造你的DataFrame B df_b = pd.DataFrame({ 'ID': [1,2], 'Labels': ['Office', 'Doctor'], 'Places': ['Upper', 'Lower'] })
方法一:用isin()实现精确匹配(最简洁)
isin()是Pandas专门用来做精确成员检查的方法,完全符合你要的“整串完全匹配”需求,直接筛选df_a中Text列的值完全出现在df_b的Labels列里的行:
# 筛选完全匹配的行 filtered_df = df_a[df_a['Text'].isin(df_b['Labels'])] print(filtered_df)
运行后得到的结果就是你要的:只保留Text为Office和Doctor的行,完全不会出现部分匹配的情况。
方法二:用merge()实现精确匹配(适合需要关联两表数据的场景)
如果你之后还需要把df_b里的其他列(比如Places)也关联过来,用merge()更合适,指定how='inner'(内连接)就只会保留完全匹配的行:
# 内连接,只保留Text和Labels完全匹配的行 merged_df = pd.merge(df_a, df_b, left_on='Text', right_on='Labels', how='inner') # 如果只需要保留原df_a的列,直接筛选就行 merged_df = merged_df[df_a.columns]
额外注意事项(踩坑预警!)
很多人会遇到“明明字符串看起来一样却匹配不上”的情况,大概率是字符串前后有隐形的空格或者换行符,建议先做一步清洗:
# 去除字符串两端的空白字符(空格、换行、制表符等) df_a['Text'] = df_a['Text'].str.strip() df_b['Labels'] = df_b['Labels'].str.strip()
先做清洗再匹配,能避免很多莫名其妙的失败~
备注:内容来源于stack exchange,提问作者Rose_Trojan
相关产品推荐
相关产品推荐

