Подсчет значений из разных столбцов

Вопрос или проблема

Я работаю с dataframe pandas, который содержит такие столбцы:

Col1     Col2    Col3    Col4
Да       Нет      Возможно Не уверен
Возможно  Да             Нет
Нет               Да    

Я пытаюсь подсчитать значения в каждом столбце, а затем сложить их, чтобы получить общие количества этих значений.
однако это не работает со столбцами, в которых отсутствуют все значения, например Col4 не содержит Да и Возможно

Как лучше всего подойти к этой проблеме?

import numpy as np
import pandas as pd

# Создаем DataFrame.
df = pd.DataFrame({
    'Col1': ['Да', 'Возможно', 'Нет'],
    'Col2': ['Нет', 'Да', np.nan],
    'Col3': ['Возможно', np.nan, 'Да'],
    'Col4': ['Не уверен', 'Нет', np.nan],
})

counts = (
    df
    .apply(pd.Series.value_counts)  # 1. Подсчитать количество вхождений каждого значения в каждом столбце.
    .sum(axis=1)                    # 2. Суммировать подсчеты по столбцам.
    .astype(int)                    # 3. Преобразовать в целое число.
    .sort_values(ascending=False)   # 4. Отсортировать подсчеты в порядке убывания.
    .to_frame('counts')             # 5. Преобразовать в именованный DataFrame.
)

> print(counts)

        counts
Нет           3
Да           3
Возможно      2
Не уверен     1

Номера 3–5 являются не обязательным форматированием.

Ответ или решение

Подсчет значений из различных столбцов в Pandas DataFrame

Введение

Вы работаете с DataFrame в библиотеке Pandas, в котором содержатся несколько столбцов с категорическими значениями. Основная задача заключается в том, чтобы подсчитать общее количество уникальных значений в каждом из столбцов, а затем суммировать эти значения, независимо от того, присутствуют ли они во всех столбцах. Эта задача становится особенно актуальной, если некоторые столбцы могут не включать все возможные значения.

Пример DataFrame

Рассмотрим ваш пример DataFrame:

import numpy as np
import pandas as pd

# Создание DataFrame
df = pd.DataFrame({
    'Col1': ['Yes', 'Perhaps', 'No'],
    'Col2': ['No', 'Yes', np.nan],
    'Col3': ['Perhaps', np.nan, 'Yes'],
    'Col4': ['Not sure', 'No', np.nan],
})

Для этого DataFrame, вы хотите получить общее количество каждого уникального значения, что приведёт к следующим результатам:

  • Yes: 3
  • No: 3
  • Perhaps: 2
  • Not sure: 1

Решение задачи

Чтобы достичь желаемого результата, можно использовать метод apply вместе с pd.Series.value_counts. Этот метод позволяет подсчитывать количество вхождений уникальных значений для каждого столбца. Затем мы суммируем результаты по горизонтали, чтобы получить общее количество значений.

Вот как можно это сделать:

# Подсчет значений в каждом столбце и суммирование по горизонтали
counts = (
    df
    .apply(pd.Series.value_counts)  # 1. Подсчитываем количество вхождений каждого значения в каждом столбце.
    .sum(axis=1)                    # 2. Суммируем подсчеты по столбцам.
    .astype(int)                    # 3. Преобразуем в целочисленный формат.
    .sort_values(ascending=False)   # 4. Сортируем по убыванию.
    .to_frame('counts')             # 5. Конвертируем в DataFrame с именованной колонкой.
)

print(counts)

Объяснение кода

  1. Подсчет значений: df.apply(pd.Series.value_counts) — этот шаг создает новую таблицу, где строки представляют уникальные значения, а столбцы — количество их вхождений в соответствующий столбец исходного DataFrame.

  2. Суммирование: sum(axis=1) — здесь сводятся результаты по строкам, что дает общее количество для каждого уникального значения среди всех столбцов.

  3. Преобразование в целочисленный формат: Метод astype(int) гарантирует, что результаты будут в формате целых чисел.

  4. Сортировка: sort_values(ascending=False) позволяет отсортировать полученные подсчеты по убыванию, что облегчает анализ самых частых значений.

  5. Конвертация в DataFrame: to_frame('counts') позволяет получать структурированные данные в виде DataFrame, что удобно для дальнейшей обработки.

Заключение

Данный подход к подсчету значений в нескольких столбцах Pandas DataFrame позволяет легко учитывать отсутствующие значения и получать актуальные данные для анализа. Вы можете адаптировать данный метод для более сложных DataFrame с учетом дополнительных признаков или категории значений в зависимости от ваших нужд. Подобные решения находят широкое применение в анализе данных и могут значительно упростить процесс получения необходимых статистических сводок.

Не забывайте, что Pandas предлагает множество других инструментов для работы с данными, которые могут помочь вам в дальнейшем.

Оцените материал
Добавить комментарий

Капча загружается...