Группировать по нескольким столбцам, создавая новый столбец в pandas кадре данных - PullRequest
0 голосов
/ 17 марта 2020

У меня есть pandas дата-кадр из двух столбцов ['company'], который является строкой, и ['publishing_datetime'], который является датой-временем.

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

пока я пробовал:

issuers = news[['company','publication_datetime']]
issuers['publication_date'] = issuers['publication_datetime'].dt.date
issuers['publication_datetime_max'] = issuers.groupby(['company','publication_date'], as_index=False)['publication_datetime'].max() 

моя группа по делает не похоже на работу.

я получаю следующую ошибку

ValueError: Wrong number of items passed 3, placement implies 1

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Вам необходим метод transform() для приведения результата в исходное измерение фрейма данных.

issuers['max'] = issuers.groupby(['company', 'publication_date'])['publication_datetime'].transform('max')

Результат вашего groupby() до того, как вы вернули многоиндексированный групповой объект, который почему он жалуется на 3 значения (первая группа, вторая группа, а затем значения). Но даже если вы только что вернули значения, они объединяются как группы, так что у вас будет меньше значений, чем нужно.

Метод transform() возвращает результаты группы для каждой строки информационного кадра таким образом, чтобы упростить создание нового столбца. Возвращаемые значения - это индексированные Series с индексами, являющимися исходными с фрейма данных issuers.

Надеюсь, это поможет! Документация по трансформации здесь

0 голосов
/ 17 марта 2020

Дело в том, что, делая то, что вы делаете, вы пытаетесь установить DataFrame в значение столбца. Выполнение следующих действий приведет к извлечению только значений без двух столбцов индекса:

issuers['publication_datetime_max'] = issuers.groupby(['company','publication_date'], as_index=False)['publication_datetime'].max().tolist()

Надеюсь, это поможет!

...