Как группировать записи фрейма данных pandas по дате в не уникальном столбце



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



data.groupby(data['date'])


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



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

1764   5  

5 ответов:

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

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

С помощью времени weekofyear,dayofweek etc. становится намного легче.

решение ecatmur будет работать нормально. Это будет лучше производительность на больших наборах данных, но:

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

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

data.groupby(lambda x: data['date'][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 с теми же свойствами и методами, что и dt accessor дает нормальные столбцы

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 метод

если ваш столбец даты не находится в индексе, вы должны указать столбец с

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

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

Comments

    Ничего не найдено.