Подсчет вхождений в столбце на основе другого столбца (даты)

Я пытаюсь подсчитать количество вхождений Type по тому месяцу, в котором они находятся.

Даны ежедневные данные, поэтому для группировки по месяцам я пытался использовать .resample(), но проблема с использованием заключается в том, что все строки объединяются в одну ДЛИННУЮ строку, а затем я не могу подсчитать количество вхождений, используя str.count(), поскольку он возвращает неправильное значение ( он находит слишком много совпадений, потому что не ищет ТОЧНЫЙ шаблон).

Я думаю, что это должно быть сделано более чем за один шаг ... Я пробовал СТОЛЬКО вещей ... Я даже слышал, что есть сводная таблица?

Образец данных:

Type Date
Cat 2020-01-01
Cat 2020-01-01
Bird 2020-01-01
Dog 2020-01-01
Cat 2020-02-01
Cat 2020-03-01
Bird 2020-03-01
Cat 2020-05-02

... За все месяцы нескольких лет ...

Конвертируется в следующий формат: (заголовки заголовков также могут быть в числовой форме)

January 2020 February 2020
Cat 4 1
Bird 1 0
Dog 1 0

person hewokiti    schedule 26.06.2021    source источник


Ответы (1)


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

Если вы не против использования дополнительных пакетов, существует несколько пакетов, которые вы можете использовать для более быстрого / простого двоичного кодирования (например, category_encoder).

import pandas as pd

# your data in dictionary format
d = {
  "Type":["Cat","Cat","Bird","Dog","Cat","Cat","Bird","Cat"],
  "Date":["2020-01-01","2020-01-01","2020-01-01","2020-01-01","2020-02-01","2020-03-01","2020-03-01","2020-05-02"]
}

# creata dataframe with the dates as index
df = pd.DataFrame(data = d['Type'], index=pd.to_datetime(d['Date'])) 


animals = list(df[0].unique()) # a list contaning all unique animals
ndf = pd.DataFrame(index=animals) # empty new dataframe with all animals as index

for animal in animals:
    ndf.loc[animal, df.index.month.unique()] = (  # at row = animal, insert all unique months
        (df == animal).groupby(df.index.month)    # groupby months, using .month (returns 1 for Jan)
                      .sum()                      # sum since we use bool comparison
                      .transpose()                # tranpose due to desired output format
                      .values                     # array of values to insert
    )

# convert column names back to date time and save as string in desired format
ndf.columns = pd.to_datetime(ndf.columns, format='%m').strftime('%B 2020')

Результат

January 2020 February 2020 March 2020 May 2020
Cat 2 1 1 1
Bird 1 0 1 0
Dog 1 0 0 0
person Seth    schedule 26.06.2021