Pandas中对DataFrame指定列唯一值计数与排序的高效实现方法
实现列唯一值计数+排序的高效方案
完全不需要硬编码逐值筛选,pandas内置的value_counts()方法就是专门为这类场景设计的,几行代码就能完成全部统计逻辑,性能和可维护性都远高于手写筛选的实现。
基础实现
读取CSV后,直接对目标列调用方法即可,默认就会完成所有唯一值的计数,并且按照出现次数从高到低自动排序:
import pandas as pd df = pd.read_csv("wimbledons_champions_claned.csv") # 自动统计所有唯一国籍的出现次数,默认降序排列 nationality_counts = df['Champion Nationality'].value_counts()
运行后返回的Series结构中,索引就是列里出现的全部唯一国籍值(AUS、FRA等不需要提前枚举),对应的值就是该国籍的冠军出现总次数。
常用参数与拓展用法
根据需求可以搭配内置逻辑调整统计规则,不需要改动核心代码:
- 需要按出现次数升序排列时,加上
ascending=True参数:nationality_counts_asc = df['Champion Nationality'].value_counts(ascending=True) - 需要将列中的空值也作为一类纳入统计时,加上
dropna=False参数(默认配置下空值会被自动排除):nationality_counts_with_na = df['Champion Nationality'].value_counts(dropna=False) - 需要将统计结果转为标准DataFrame方便后续分析时,调用
to_frame()重命名列即可:nationality_counts_df = df['Champion Nationality'].value_counts().to_frame(name='total_champions') - 如果需要按国籍代码的字母顺序排序、而非按出现次数排序,可以在调用方法后再接
sort_index():nationality_counts_sorted_by_code = df['Champion Nationality'].value_counts().sort_index()
方案对比优势
和硬编码逐值筛选的实现相比:
- 不需要提前知道列里有多少类唯一值、每个值的具体编码,哪怕后续数据集更新新增了国籍类型,代码也不需要修改就能自动完成统计
- 基于pandas向量化计算实现,运行效率远高于逐行筛选拼接
len()的写法,数据量越大性能优势越明显 - 内置支持排序、空值处理等常用逻辑,大幅减少重复代码量
内容的提问来源于stack exchange,提问作者Chandler Dugan
相关产品推荐
相关产品推荐

