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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:36:03