Ответ 1
Решение ecatmur будет работать нормально. Тем не менее, это будет лучше для больших наборов данных:
data.groupby(data['date'].map(lambda x: x.year))
A Pandas DataFrame
содержит столбец с именем "date"
, который содержит не уникальные значения datetime
.
Я могу сгруппировать строки в этом фрейме, используя:
data.groupby(data['date'])
Однако это разделяет данные на значения datetime
. Я хотел бы сгруппировать эти данные к году, хранящемуся в столбце "дата". Эта страница показывает, как группироваться по годам в случаях, когда метка времени используется как индекс, что не соответствует моему случаю.
Как достичь этой группировки?
Решение ecatmur будет работать нормально. Тем не менее, это будет лучше для больших наборов данных:
data.groupby(data['date'].map(lambda x: x.year))
Я использую pandas 0.16.2. Это улучшает производительность моего большого набора данных:
data.groupby(data.date.dt.year)
Используя параметр dt
и играя с weekofyear
, dayofweek
и т.д. становится намного проще.
Это должно работать:
data.groupby(lambda x: data['date'][x].year)
Это может быть проще объяснить с помощью набора данных образца.
Создать пример данных
Предположим, что у нас есть один столбец Timestamps, 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
accessor с свойством year
Если у вас есть столбец (а не индекс) pandas Timestamps, вы можете получить доступ ко многим дополнительным свойствам и методам с помощью dt
accessor. Например:
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
accessor дает нормальные столбцы
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
это также будет работать
data.groupby(data['date'].dt.year)