行者孙Python

烹制篇-Day21|计数量盘:value_counts 统计频次、占比

📖 知识点

1. value_counts () 统计频次

统计某列每个 "取值" 出现的次数:

# 统计"菜系"列每个菜系出现几次
df["菜系"].value_counts()

运行输出:

川菜    2
鲁菜    2
粤菜    2
Name: 菜系, dtype: int64

2. 算占比(归一化)

加 normalize=True,返回每个取值所占比例(总和为 1):

# 统计占比(0~1的小数)
df["菜系"].value_counts(normalize=True)

运行输出:

川菜    0.333333
鲁菜    0.333333
粤菜    0.333333
Name: 菜系, dtype: float64

3. 常用参数

参数作用
normalize=True返回占比(比例)
ascending=True按频次升序(默认降序)
.sort_values()进一步排序

💡 理解

  • value_counts() 默认按频次降序排列(出现最多的排最前)
  • normalize=True 把次数变成比例,方便看占比
  • 适合统计:分类字段的分布(地区、类型、状态等)

⚠️ 易错提醒

  1. value_counts() 通常作用于单个列(Series),df["列"].value_counts()
  2. normalize=True 返回的是占比小数,不是次数
  3. 空值默认会被忽略,不参与计数

⚔️ Kata 实战任务

任务需求:

  1. 导入 pandas,创建一份数据(菜系、好评与否等分类列)
  2. 用 df["菜系"].value_counts() 统计每个菜系出现次数
  3. 用 normalize=True 统计占比
  4. 打印结果,理解频次和占比

参考代码

import pandas as pd

data = {
    "菜系": ["川菜", "鲁菜", "川菜", "粤菜", "鲁菜", "川菜"],
    "菜名": ["麻婆豆腐", "葱爆羊肉", "回锅肉", "白切鸡", "糖醋鱼", "水煮鱼"],
}
df = pd.DataFrame(data)

# 计数量盘:统计菜系频次
print("===== 各菜系出现次数(降序)=====")
print(df["菜系"].value_counts())

print("\n===== 各菜系占比 =====")
print(df["菜系"].value_counts(normalize=True))

运行输出:

===== 各菜系出现次数(降序)====="
川菜    3
鲁菜    2
粤菜    1
Name: 菜系, dtype: int64

===== 各菜系占比 =====
川菜    0.500000
鲁菜    0.333333
粤菜    0.166667
Name: 菜系, dtype: float64

💡 观察:川菜出现 3 次、占一半 (0.5),鲁菜 2 次、粤菜 1 次。value_counts 自动按次数降序排列,一眼看出哪个菜系最多。占比则直观给出 "各占几成"。

🧠 思考题

  1. value_counts() 默认按什么顺序排列?想从少到多看要加什么参数?
  2. normalize=True 返回的值加起来约等于多少?它和次数有什么关系?
‹ 返回目录
🏠首页 Python 📦资源 👤关于我