Python用pandas读取Excel时因em破折号/连字符导致数据过滤失败
pandas按含特殊破折号的列值过滤失败解决方案
问题原因
过滤失败的核心是破折号字符不匹配:肉眼看起来相似的破折号实际属于不同Unicode字符,常见的包括半角连字符-、en破折号–、em破折号—、全角破折号——等,手打输入的字符和Excel单元格内实际存储的字符编码不一致,导致精确匹配失效。
可用解决方案
方案1:统一破折号后匹配(最稳妥)
先把Category列中所有类型的破折号统一替换为同一个标准字符(比如半角连字符),再做匹配,避免编码差异问题。
修改后完整代码:
import pandas as pd import re from pathlib import Path DATA_DIR = Path(r'E:') # 原代码Path.cwd() / r'E:'写法有误,直接指定E盘即可 excelA = DATA_DIR / 'Test.xlsx' df = pd.read_excel(excelA) # 预处理:将所有类型的破折号统一替换为半角连字符 df['Category'] = df['Category'].apply(lambda x: re.sub(r'[–—―−]', '-', str(x))) # 过滤值统一使用半角连字符 catg = ['Cat - AB'] df_new = df[df['Category'].isin(catg)] print(df_new)
方案2:模糊匹配规避字符差异
如果不需要严格匹配全值,用正则模糊匹配,跳过破折号的精确判断:
# 匹配包含Cat、中间任意字符、AB的类目,忽略中间的破折号类型 df_new = df[df['Category'].str.contains(r'Cat\s*.*?\s*AB', na=False)]
方案3:直接复制实际值匹配
先打印出Category列的所有唯一值,复制你需要的目标值到过滤列表,避免手打输入的字符偏差:
# 先输出所有类目值 print(df['Category'].unique()) # 从输出结果中直接复制目标值粘贴到catg列表即可 catg = ['Cat – AB'] # 这里的值是复制来的,不是手打,就可以匹配成功 df_new = df[df['Category'].isin(catg)]
其他注意事项
原代码中values1 = df1属于无效代码,df1未定义会触发报错,可直接删除该行。
内容的提问来源于stack exchange,提问作者aza01
相关产品推荐
相关产品推荐

