Функция Pandas pd.value_counts()
Часто используемые функции Pandas
pd.value_counts()— это функция в библиотеке Pandas, используемая дляподсчёта частоты каждого значения. Она вычисляет количество вхождений каждого уникального значения в массиве и возвращает их, отсортированными по частоте в порядке убывания.
Это одна из наиболее часто используемых функций в анализе категориальных данных, позволяющая быстро понять распределение данных, например подсчитать результаты голосования, распределение категорий товаров и т. д.
Значение слова: value_countsЭто означает "count values", т. е. подсчёт количества вхождений каждого значения.
Базовый синтаксис и параметры
pd.value_counts()Это функция верхнего уровня библиотеки Pandas, используемая для вычисления частоты каждого уникального значения.
Формат синтаксиса
pd.value_counts(values, sort=True, ascending=False, normalize=False, bins=None, dropna=True)
Описание параметра
- Параметр:
values- Тип: Series, объект, подобный массиву.
- Описание: Данные, частоты которых нужно подсчитать. Обычно Series.
- Параметр:
sort- Тип: Boolean.
- Сортировать ли по частоте. По умолчанию
True(в порядке убывания частоты).
ascending
- Тип: Boolean.
- Если
True, сортировать по частоте в порядке возрастания; еслиFalse(по умолчанию), сортировать по частоте в порядке убывания.
normalize
- Тип: Boolean.
- Если
True, возвращать долю каждого значения (от 0 до 1) вместо абсолютной частоты. По умолчанию принимает значениеFalse。
bins
- Тип: Integer или None.
- Если указано целое число, числовые данные разбиваются на интервалы, и подсчитываются частоты (аналогично гистограмме). Не применимо к категориальным данным.
dropna
- Тип: Boolean.
- Включать ли NaN в результаты статистики. По умолчанию принимает значение
True(не включено).
Описание функций
- Возвращаемое значение: Возвращает Series, где индекс — уникальные значения, а значения — частоты (или доли).
- Действие: Подсчитывает и отображает количество вхождений каждого уникального значения.
Примеры
Давайте досконально освоимpd.value_counts()использование.
Пример 1: Базовое использование — подсчёт частот категориальных данных
Пример
import numpy as np
# 1. Создайте Series, содержащий повторяющиеся значения
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow', 'red', 'blue', 'blue'])
print("=== Исходная Series ===")
print(colors)
# 2. Используйте pd.value_counts() для подсчёта частот
result = pd.value_counts(colors)
print("\n=== pd.value_counts() статистика частот ===")
print(result)
Ожидаемый вывод:
=== 原始 Series === 0 red 1 blue 2 green 3 red 4 blue 5 yellow 6 red 7 blue 8 blue dtype: object === pd.value_counts() 频次统计 === blue 4 red 3 green 1 yellow 1 dtype: int64
Пояснение к коду:
- Результаты отсортированы по частоте в порядке убывания; синий встречается чаще всего (4 раза), красный — следующий (3 раза), а зелёный и жёлтый встречаются по 1 разу.
- Возвращается Series, где значения цветов являются индексом, а количества — значениями.
Пример 2: Использование параметра normalize для вычисления пропорций
normalize=TrueЧастоты можно преобразовать в пропорции, что упрощает просмотр относительного распределения данных.
Пример
import numpy as np
# Создание данных для голосования
votes = pd.Series(['A', 'B', 'A', 'C', 'A', 'B', 'A', 'A', 'C', 'B', 'A', 'B'])
print("=== Данные голосования ===")
print(votes)
# 1. Абсолютная частота
print("\n=== Абсолютная частота ===")
print(pd.value_counts(votes))
# 2. Относительные доли (normalize=True)
print("\n=== Относительные доли ===")
result_normalized = pd.value_counts(votes, normalize=True)
print(result_normalized)
print(f"\nСумма долей: {result_normalized.sum():.2f}")
# 3. Сортировка по возрастанию
print("\n=== Отсортировано по возрастанию ===")
print(pd.value_counts(votes, ascending=True))
Ожидаемый вывод:
=== 投票数据 === 0 A 1 B 2 A 3 C 4 A 5 B 值 'A' 出现 6 次,占 50% 值 'B' 出现 4 次,约 33.3% 值 'C' 出现 2 次,约 16.7% === 相对比例 === A 0.500000 B 0.333333 C 0.166667 dtype: float64 === 升序排列 === C 2 B 4 A 6 dtype: int64
Пояснение к коду:
- Использование
normalize=Trueпозволяет быстро рассчитать долю каждой категории. - Все доли в сумме дают 1.0, что удобно для анализа долей.
- Использование
ascending=Trueпозволяет просматривать результаты в порядке возрастания частоты.
Пример 3: Обработка числовых данных и использование параметра bins
Для непрерывных числовых значений можно использоватьbinsпараметр для выполнения статистики по интервалам.
Пример
import numpy as np
# 1. Создание числовых данных
scores = pd.Series([85, 90, 78, 92, 88, 76, 95, 82, 70, 89, 91, 77, 84, 86])
print("=== Баллы студентов ===")
print(scores)
# 2. Без разбивки на интервалы - подсчёт каждого уникального значения
print("\n=== Подсчёт каждого балла ===")
print(pd.value_counts(scores))
# 3. Использование параметра bins для разбивки на интервалы
print("\n=== Разделено на 4 интервала ===")
result_bins = pd.value_counts(scores, bins=4)
print(result_bins)
# 4. Просмотр границ интервалов
print("\n=== Границы интервалов ===")
print(f"Минимальное значение: {scores.min()}, Максимальное значение: {scores.max()}")
Ожидаемый вывод:
=== 学生成绩 === [85, 90, 78, 92, 88, 76, 95, 82, 70, 89, 91, 77, 84, 86] === 统计每个分数 === 85 2 90 1 78 1 92 1 88 1 76 1 95 1 82 1 70 1 89 1 91 1 77 1 84 1 86 1 Name: count, dtype: int64 === 分成 4 个箱 === result_bins = pd.value_counts(scores, bins=4) (88.75, 95.0] 5 (82.5, 88.75] 4 (76.25, 82.5] 3 (69.97399999999999, 76.25] 2 Name: count, dtype: int64 === 分箱边界 === 最小值: 70, 最大值: 95
Это похоже на гистограмму и показывает, что распределение оценок в основном сосредоточено в средне-высоком диапазоне. Параметр bins разбивает числовые данные на дискретные интервалы по диапазону, а затем подсчитывает количество данных в каждом интервале.
Пример 4: Обработка пропущенных значений
Используяdropnaпараметр определяет, учитываются ли пропущенные значения.
Пример
import numpy as np
# 1. Данные, содержащие пропущенные значения
data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', np.nan, 'b', 'a'])
print("=== Данные, содержащие пропущенные значения ===")
print(data)
# 2. NaN не включается по умолчанию (dropna=True)
print("\n=== NaN не включается по умолчанию ===")
print(pd.value_counts(data))
# 3. Включить NaN (dropna=False)
print("\n=== Включение NaN ===")
print(pd.value_counts(data, dropna=False))
# 4. Подсчёт пропущенных значений для числовых данных
numeric_data = pd.Series([1, 2, np.nan, 3, 2, np.nan, 1, 4])
print("\n=== Числовые данные, содержащие NaN ===")
print(pd.value_counts(numeric_data, dropna=False))
Ожидаемый вывод:
=== 包含缺失值的数据 === 0 a 1 b 2 NaN 3 a 4 None 5 c 6 NaN 7 b 8 a dtype: object === 默认不包含 NaN === a 3 b 2 c 1 dtype: 64 === 包含 NaN (dropna=False) === a 3 b 2 NaN 2 # 2 个 NaN (2 个 np.nan) c 1 dtype: int64 === 数值型数据包含 NaN === 1.0 2 2.0 2 NaN 2 # 2 个 NaN 3.0 1 4.0 1 dtype: int64
Пояснение к коду:
- По умолчанию (
dropna=True), значения NaN не учитываются. - Использование
dropna=Falseпозволяет просмотреть количество пропущенных значений, что полезно при анализе качества данных. - Это также применимо к числовым данным.
Другие расширенияСовет:
pd.value_counts()Это одна из самых важных функций в разведочном анализе данных, позволяющая быстро понять распределение данных. Если вам нужно только получить список уникальных значений без частот, используйтеpd.unique()функцию.