pandas使用value_counts统计时无法识别相同值、结果异常如何解决
异常原因
ORIGIN列的同国籍字符串存在肉眼不可区分的内容差异,pandas的value_counts()为精确匹配机制,因此会被拆分为不同类别统计。最常见的差异来源为字符串首尾多余的空白字符(空格、制表符、换行符等),其次为零宽空格、不间断空格等特殊不可见Unicode字符,小概率场景为全角/半角字符混用、大小写不一致。
问题排查
执行如下代码可确认是否为字符内容差异问题:
# 打印ORIGIN列所有唯一值的原始表示、字符长度 for val in file['ORIGIN'].unique(): print(f"原始值:{repr(val)},字符长度:{len(val)}")
如果相同文字的值返回的长度不一致、或repr()输出中能看到额外的空白/特殊字符,即可确认问题根源。
解决方案
普通首尾空白场景
如果仅为普通首尾空白,直接用strip()清除即可:
import pandas as pd file = pd.read_csv("test_data.csv") # 清洗后直接统计 file['ORIGIN'].str.strip().value_counts() # 如需保存清洗后结果到原列 # file['ORIGIN'] = file['ORIGIN'].str.strip()
包含特殊不可见字符场景
如果存在零宽空格、不间断空格等特殊不可见字符,可通过正则清除所有非打印字符后再统计:
import re # 清除所有不可见特殊字符+首尾空白 file['ORIGIN'] = file['ORIGIN'].apply(lambda x: re.sub(r'[\x00-\x1F\x7F-\x9F\u200B-\u200F\uFEFF]', '', x).strip()) file['ORIGIN'].value_counts()
其他兼容场景
如果存在全角半角混用、大小写不一致的问题,可增加对应处理逻辑:
def clean_origin_str(s): # 全角转半角 res = [] for c in s: ord_c = ord(c) if ord_c == 12288: res.append(' ') elif 65281 <= ord_c <= 65374: res.append(chr(ord_c - 65248)) else: res.append(c) s = ''.join(res) # 清除不可见字符+首尾空白 s = re.sub(r'[\x00-\x1F\x7F-\x9F\u200B-\u200F\uFEFF]', '', s).strip() # 统一为标题格式(首字母大写,其余小写) s = s.title() return s file['ORIGIN'] = file['ORIGIN'].apply(clean_origin_str) file['ORIGIN'].value_counts()
内容的提问来源于stack exchange,提问作者almegdadi
相关产品推荐
相关产品推荐

