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

统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:05:15