Как группировать записи фрейма данных pandas по дате в не уникальном столбце
В Пандах DataFrame содержит столбец с именем "date", который содержит неуникальные datetime значения.
Я могу сгруппировать строки в этом кадре с помощью:
data.groupby(data['date'])
однако это разбивает данные на datetime значения. Я хотел бы сгруппировать эти данные по годам, хранящимся в столбце" дата". на этой странице показывает, как группировать по годам в случаях, когда метка времени используется в качестве индекса, что не верно в моем случае.
как мне достичь этой группировки?
5 ответов:
Я использую панды 0.16.2. Это имеет лучшую производительность на моем большом наборе данных:
data.groupby(data.date.dt.year)С помощью времени
weekofyear,dayofweeketc. становится намного легче.
решение ecatmur будет работать нормально. Это будет лучше производительность на больших наборах данных, но:
data.groupby(data['date'].map(lambda x: x.year))
это может быть проще объяснить с помощью образца набора данных.
Создать Образец Данных
предположим, у нас есть один столбец временных меток,
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есть несколько способов группировать по годам
- используйте DT accessor с
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
поместите дату в индекс и используйте анонимную функцию для доступа к year
если вы зададите столбец date в качестве индекса, он станет DateTimeIndex с теми же свойствами и методами, что и
dtaccessor дает нормальные столбцыdf1 = df.set_index('date') df1.index.year Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')интересно, что при использовании метода groupby вы можете передать ему функцию. Эта функция будет неявно передана индексу фрейма данных. Таким образом, мы можем получить тот же результат сверху следующее:
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max']) sum mean max 2012 14 7 9 2015 6 2 3
использовать
resampleметодесли ваш столбец даты не находится в индексе, вы должны указать столбец с
Comments