Pandas DataFrame
содержит столбец с именем, "date"
который содержит неуникальные datetime
значения. Я могу сгруппировать строки в этом кадре, используя:
data.groupby(data['date'])
Однако при этом данные разбиваются по datetime
значениям. Я хотел бы сгруппировать эти данные по годам, хранящимся в столбце «Дата». На этой странице показано, как группировать по годам в случаях, когда отметка времени используется в качестве индекса, что в моем случае неверно.
Как мне добиться этой группировки?
Ответы:
Я использую панды 0.16.2. Это дает лучшую производительность для моего большого набора данных:
Используя
dt
опцию и играть сweekofyear
, иdayofweek
т.д. становится гораздо проще.источник
Решение ecatmur подойдет. Тем не менее, это будет лучше для больших наборов данных:
data.groupby(data['date'].map(lambda x: x.year))
источник
map
обычно обладает некоторыми хорошими качествами эффективности при применении произвольных функций по сравнению с простым использованиемapply
.Это может быть проще объяснить на примере набора данных.
Создать образец данных
Давайте предположим , что у нас есть один столбец отметки времени,
date
и еще один столбец , мы хотели бы выполнить агрегацию на,a
.df = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-6-1', '2015-1-1', '2015-2-1', '2015-3-1']), 'a':[9,5,1,2,3]}, columns=['date', 'a']) df date a 0 2012-01-01 9 1 2012-06-01 5 2 2015-01-01 1 3 2015-02-01 2 4 2015-03-01 3
Есть несколько способов сгруппировать по годам
year
свойствомdate
индекс и используйте анонимную функцию для доступа к годуresample
Метод использования.dt
аксессуар соyear
свойствомКогда у вас есть столбец (а не индекс) временных меток pandas, вы можете получить доступ ко многим дополнительным свойствам и методам с помощью средства
dt
доступа. Например:df['date'].dt.year 0 2012 1 2012 2 2015 3 2015 4 2015 Name: date, dtype: int64
Мы можем использовать это для формирования наших групп и вычисления некоторых агрегатов для определенного столбца:
df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max']) sum mean max date 2012 14 7 9 2015 6 2 3
поместите дату в индекс и используйте анонимную функцию для доступа к году
Если вы установите столбец даты в качестве индекса, он станет DateTimeIndex с теми же свойствами и методами, что и средство
dt
доступа дает обычные столбцы.df1 = df.set_index('date') df1.index.year Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')
Интересно, что при использовании метода groupby вы можете передать ему функцию. Этой функции будет неявно передан индекс DataFrame. Итак, мы можем получить тот же результат сверху со следующим:
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max']) sum mean max 2012 14 7 9 2015 6 2 3
Используйте
resample
методЕсли столбец даты отсутствует в индексе, необходимо указать столбец с
on
параметром. Вам также необходимо указать псевдоним смещения в виде строки.df.resample('AS', on='date')['a'].agg(['sum', 'mean', 'max']) sum mean max date 2012-01-01 14.0 7.0 9.0 2013-01-01 NaN NaN NaN 2014-01-01 NaN NaN NaN 2015-01-01 6.0 2.0 3.0
Преобразовать в период панд
Вы также можете преобразовать столбец даты в объект Pandas Period. Мы должны передать псевдоним смещения в виде строки, чтобы определить длину периода.
df['date'].dt.to_period('A') 0 2012 1 2012 2 2015 3 2015 4 2015 Name: date, dtype: object
Затем мы можем использовать это как группу
df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max']) sum mean max 2012 14 7 9 2015 6 2 3
источник
to_period('A')
, для чего это («А»)?'A'
это псевдоним смещения таймсерии: pandas.pydata.org/pandas-docs/stable/….dt.year
метод и сохраняю его в новом фрейме данных, даты сохраняются как индексы, и это становится проблематичным, если, скажем, мне нужно построить данные, потому что столбца «даты» на самом деле нет, а есть только три предоставлено.agg()
Это должно работать:
data.groupby(lambda x: data['date'][x].year)
источник
это тоже будет работать
data.groupby(data['date'].dt.year)
источник
<pandas.core.groupby.DataFrameGroupBy object at 0x10d7f6438>
это то, что я получаю при исполнении.