You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python/Pandas行数据匹配需求:忽略无关差异与特殊字符

实现方案

核心思路

  1. 文本预处理:统一清理/、,、-等特殊字符,将内容拆分为词汇/数字的集合
  2. 集合包含判断:通过集合的子集校验,判断其中一行的所有元素是否被另一行完全包含

代码实现

步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:45:49