#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 |