非常游戏网
怎么在Python中快速统计列中各元素的出现频率_使用value_counts方法

怎么在Python中快速统计列中各元素的出现频率_使用value_counts方法

2026-05-24日常编程257686

value_counts()默认不统计NaN是设计行为,因dropna=True为默认参数;需显式设置dropna=False才包含NaN计数,且仅对Series有效。

value_counts() 为什么默认不统计 NaN?

value_counts() 默认会自动丢弃 NaN,这不是 bug,是设计行为。如果你发现结果里没看到空值频次,别急着怀疑数据——先确认是否用了 dropna=False 参数。

  • 想包含空值:必须显式传 dropna=False
  • Series 直接调用才有效;DataFrame 没这个方法,得先选列(如 df["col"].value_counts()
  • 返回的是 Series,索引是原列的唯一值,值是对应频次,不是字典也不是列表

排序和归一化怎么控制?

默认按频次降序排,但容易忽略两个关键参数:sortnormalize

  • sort=False 时,结果按原始数据中首次出现顺序排列(不是字母/数值序),适合保留业务顺序
  • normalize=True 返回比例而非计数,注意结果是 float 类型,且总和为 1.0(除非有 NaNdropna=True
  • 组合使用示例:s.value_counts(sort=False, normalize=True, dropna=False)

遇到“TypeError: unhashable type”怎么办?

这个错误通常出现在列里有 list、dict、set 等不可哈希类型时。value_counts() 内部依赖哈希表去重计数,而 list 不可哈希。

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

  • 检查报错列:用 s.apply(type).unique() 看类型分布
  • 临时方案:转成字符串再统计(s.astype(str).value_counts()),但要注意 [1,2][1, 2] 可能被当成不同值
  • 根本解法:提前标准化数据结构,比如把 list 转 tuple(如果元素本身可哈希)

大数据量下性能卡顿,有没有更快替代?

当列长度超百万级,value_counts() 可能比纯 Python 的 collections.Counter 慢,尤其开了 normalizedropna=False

  • 纯计数场景(不要比例、不关心 NaN):Counter(s.dropna()) 通常快 2–3 倍
  • 要保留 pandas 输出格式?用 pd.Series(Counter(s.dropna())) 补一层封装
  • 注意:Counter 不处理 NaN,也不支持 sort 参数,得自己调 .most_common()

真正卡住的时候,往往不是方法选错,而是忘了先做 s = s.dropna().astype(str) 这类预处理——类型混乱比数据量更伤性能。