У меня есть фрейма данных панд, df
как:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Я хочу сгруппировать по первому столбцу и получить второй столбец в виде списков в строках :
A [1,2]
B [5,5,4]
C [6]
Можно ли сделать что-то подобное с помощью групповых панд?
tuple
следующий второй ответ: stackoverflow.com/questions/19530568/… . См. Второй ответ в stackoverflow.com/questions/27439023/… для объяснения.Если производительность важна, опуститесь до уровня numy:
тесты:
источник
.groupby([df.index.month, df.index.day])
вместо «только».groupby('a')
?Удобный способ добиться этого будет:
Посмотрите на написание пользовательских агрегатов: https://www.kaggle.com/akshaysehgal/how-to-group-by-aggregate-using-py
источник
lambda args: f(args)
эквивалентноf
agg(list)
достаточно. Также смотрите здесь .df.groupby('a').apply(list)
либо использовать его с agg как часть dictdf.groupby('a').agg({'b':list})
. Вы также можете использовать его с лямбдой (что я рекомендую), так как вы можете сделать с ней гораздо больше. Пример:df.groupby('a').agg({'c':'first', 'b': lambda x: x.unique().tolist()})
который позволяет применить функцию серии к столбцу col c и уникальную функцию списка к столбцу col b.Как вы сказали,
groupby
методpd.DataFrame
объекта может сделать эту работу.пример
который дает и индексное описание групп.
Чтобы получить элементы отдельных групп, вы можете сделать, например,
источник
Чтобы решить эту проблему для нескольких столбцов данных:
Этот ответ был вдохновлен ответом Анамики Моди . Спасибо!
источник
Используйте любой из следующих
groupby
иagg
рецептов.Чтобы объединить несколько столбцов в виде списков, используйте любое из следующего:
Чтобы сгруппировать список только в один столбец, преобразуйте groupby в
SeriesGroupBy
объект, а затем вызовитеSeriesGroupBy.agg
. Использование,источник
groupby(..., sort=False)
. Здесь это не имеет значения, так как я группируюсь по столбцу А, который уже отсортирован.df.groupby('a')['b'].agg(lambda x: list(set(x)))
Если вы ищете уникальный список при группировании нескольких столбцов, это может помочь:
источник
Давайте использовать
df.groupby
со списком иSeries
конструкторомисточник
Пора использовать
agg
вместоapply
.когда
Если вы хотите, чтобы несколько столбцов складывались в список, результат
pd.DataFrame
Если вы хотите один столбец в списке, результат
ps.Series
Обратите внимание, что результат
pd.DataFrame
примерно в 10 раз медленнее, чем результат,ps.Series
когда вы агрегируете только один столбец, используйте его в случае нескольких столбцов.источник
Здесь я сгруппировал элементы с "|" в качестве разделителя
источник
Самый простой способ, который я вижу, - не достичь большинства одинаковых вещей хотя бы для одного столбца, который похож на ответ Анамики только с синтаксисом кортежа для функции агрегирования.
источник