统计DataFrame列中类别值出现次数的最优方法探讨
统计DataFrame类别出现次数的最优方案?
原始DataFrame
import pandas as pd dfsupport = pd.DataFrame({'Date': ['8/12/2020','8/12/2020','13/1/2020','24/5/2020','31/10/2020','11/7/2020','11/7/2020','4/4/2020','1/2/2020'], 'Category': ['Table','Chair','Cushion','Table','Chair','Mats','Mats','Large','Large'], 'Sales': ['1 table','3chairs','8 cushions','3Tables','12 Chairs','12Mats','4Mats','13 Chairs and 2 Tables', '3 mats, 2 cushions 4@chairs'], 'Paid': ['Yes','Yes','Yes','Yes','No','Yes','Yes','No','Yes'], 'Amount': ['93.78','$51.99','44.99','38.24','£29.99','29 21 only','18','312.8','63.77' ] })
问题与当前实现
想要统计Category列各类别的出现次数,当前使用的代码如下:
print(dfsupport.groupby(dfsupport['Category'],dropna=True).apply(lambda y: y['Category'].count()))
输出结果:
Category Chair 2 Cushion 1 Large 2 Mats 2 Table 2 dtype: int64
回答
你当前的方法能得到正确结果,但绝对不是最优方案,Pandas有更简洁高效的专用方法:
1. 最推荐:value_counts()
这是统计列值频次的标准方法,代码极简且性能拉满,默认自动排除NaN值:
print(dfsupport['Category'].value_counts())
输出和你当前的结果完全一致,而且value_counts()是Pandas底层优化的向量化方法,比groupby+apply快得多,数据量越大优势越明显。
2. 若坚持用groupby:groupby+size()
没必要用apply加lambda的冗余写法,直接用size()就能统计每组行数,同样自动忽略NaN:
print(dfsupport.groupby('Category', dropna=True).size())
为什么你的方法不够好?
- 冗余:
groupby后调用apply(lambda y: y['Category'].count())完全多此一举,size()或value_counts()直接就能搞定 - 性能:
apply会逐组执行lambda,属于循环式操作,远不如Pandas内置的向量化方法高效
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

