Подтвердить что ты не робот

Как группировать pandas записи DataFrame по дате в столбце, отличном от уникального

A Pandas DataFrame содержит столбец с именем "date", который содержит не уникальные значения datetime. Я могу сгруппировать строки в этом фрейме, используя:

data.groupby(data['date'])

Однако это разделяет данные на значения datetime. Я хотел бы сгруппировать эти данные к году, хранящемуся в столбце "дата". Эта страница показывает, как группироваться по годам в случаях, когда метка времени используется как индекс, что не соответствует моему случаю.

Как достичь этой группировки?

4b9b3361

Ответ 1

Решение ecatmur будет работать нормально. Тем не менее, это будет лучше для больших наборов данных:

data.groupby(data['date'].map(lambda x: x.year))

Ответ 2

Я использую pandas 0.16.2. Это улучшает производительность моего большого набора данных:

data.groupby(data.date.dt.year)

Используя параметр dt и играя с weekofyear, dayofweek и т.д. становится намного проще.

Ответ 3

Это должно работать:

data.groupby(lambda x: data['date'][x].year)

Ответ 4

Это может быть проще объяснить с помощью набора данных образца.

Создать пример данных

Предположим, что у нас есть один столбец 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

Существует несколько способов группировать по годам

  • Используйте аксессуар dt с свойством year
  • Поместите date в индекс и используйте анонимную функцию для доступа к году
  • Использовать метод resample
  • Преобразовать в pandas Период

.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 Период

Вы также можете преобразовать столбец даты в объект 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

Ответ 5

это также будет работать

data.groupby(data['date'].dt.year)