Python/Pandas行数据匹配需求:忽略无关差异与特殊字符
实现方案
核心思路
- 文本预处理:统一清理
/、,、-等特殊字符,将内容拆分为词汇/数字的集合 - 集合包含判断:通过集合的子集校验,判断其中一行的所有元素是否被另一行完全包含
代码实现
步骤1:定义文本预处理函数
import pandas as pd import re def process_text(text): # 处理空值情况 if pd.isna(text): return set() # 替换特殊字符为空格,统一格式 cleaned_text = re.sub(r'[/,-]', ' ', str(text)) # 拆分内容为词汇/数字,转小写(若需区分大小写可移除.lower()) tokens = cleaned_text.strip().lower().split() # 返回集合,自动去重 return set(tokens)
步骤2:处理数据并执行包含判断
假设你的Excel数据包含col1和col2两列,需要互相校验包含关系:
# 读取本地Excel数据(替换为你的文件路径) df = pd.read_excel('test_data.xlsx') # 对两列分别做预处理,生成集合列 df['col1_set'] = df['col1'].apply(process_text) df['col2_set'] = df['col2'].apply(process_text) # 判断col2的所有元素都被col1包含 df['col1_contains_col2'] = df.apply(lambda row: row['col2_set'].issubset(row['col1_set']), axis=1) # 判断col1的所有元素都被col2包含 df['col2_contains_col1'] = df.apply(lambda row: row['col1_set'].issubset(row['col2_set']), axis=1) # 输出结果查看 print(df[['col1', 'col2', 'col1_contains_col2', 'col2_contains_col1']])
示例验证
比如你提到的场景:
- 行A:
"CPU assembly i5-10400"预处理后集合为{'cpu', 'assembly', 'i5', '10400'} - 行B:
"i5 10400 CPU"预处理后集合为{'i5', '10400', 'cpu'}
此时col1_contains_col2返回True(行B的所有元素都在A中),col2_contains_col1返回False(A多了assembly)。
另一个例子:
- 行C:
"GPU E3-1230"预处理后集合为{'gpu', 'e3', '1230'} - 行D:
"GPU 1230"预处理后集合为{'gpu', '1230'}col1_contains_col2(C包含D)返回True,col2_contains_col1返回False。
注意事项
- 若需区分大小写,移除预处理函数中的
.lower()即可 - 可扩展
re.sub中的特殊字符列表,比如添加\.、@等符号:r'[/,-\.@]' - 空值处理:函数已兼容空值,空集合会被判定为任何集合的子集(若某行内容为空,另一行包含它会返回
True)
内容的提问来源于stack exchange,提问作者Marcin Zadrzyński
相关产品推荐
相关产品推荐

