Pandas DataFrame字符串列分类计数 排除相似子串误匹配实现精准统计
调整方案
原有逻辑的计数偏差根源是str.contains采用子串匹配规则:只要字段值中包含目标字符串片段就会被判定为命中,因此带更长类名前缀的行都会被误统计。要实现精准分类计数,只需把匹配规则从“包含子串”改为值完全相等即可。
兼容原有代码结构的循环实现
把原代码里的过滤条件从df.tag.str.contains(data_type,na=False)替换为相等判断,同时修正原代码中的变量名笔误(原代码存在循环变量命名不一致、dtype类名误引用的问题,会导致运行时报错),完整可运行代码如下:
import pandas as pd d = {'tag': ['DATA', 'DATAKIND','DATA','DATA','DATAKINDSIM','DATAKIND']} df = pd.DataFrame(data=d) data_types=['DATA','DATAKIND','DATAKINDSIM'] for data_type in data_types: print(data_type) counting = df[df['tag'] == data_type].count() print(counting)
运行后输出即为预期效果:
DATA tag 3 dtype: int64 DATAKIND tag 2 dtype: int64 DATAKINDSIM tag 1 dtype: int64
更高效的无循环实现
不需要手动写循环遍历类别,直接使用Pandas内置的分类计数能力即可,数据量大时性能远高于循环判断:
# 对tag列的所有值直接计数,再按照指定的类别顺序对齐结果 count_result = df['tag'].value_counts().reindex(data_types) print(count_result)
输出结果:
DATA 3 DATAKIND 2 DATAKINDSIM 1 Name: tag, dtype: int64
这种方法还能自动处理不存在的类别值,避免手动写循环可能遗漏的边界问题。
注意:如果后续tag列存在大小写不一致、前后带空格的脏数据,可以在计数前先做标准化处理,比如
df['tag'] = df['tag'].str.strip().str.upper(),避免因为格式问题导致的匹配失效。
内容的提问来源于stack exchange,提问作者Carlos P.Dengra
相关产品推荐
相关产品推荐

