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

#python #dataframe #count #time-series #columnsorting

Вопрос:

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

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

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

Примеры данных:

Тип Дата
Кошка 2020-01-01
Кошка 2020-01-01
Птица 2020-01-01
Собака 2020-01-01
Кошка 2020-02-01
Кошка 2020-03-01
Птица 2020-03-01
Кошка 2020-05-02

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

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

Январь 2020 года Февраль 2020 года
Кошка 4 1
Птица 1 0
Собака 1 0

Ответ №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')
 

Результат

Январь 2020 года Февраль 2020 года Март 2020 года Май 2020 года
Кошка 2 1 1 1
Птица 1 0 1 0
Собака 1 0 0 0