Eu tenho um quadro de dados de pandas df
como:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Quero agrupar pela primeira coluna e obter a segunda coluna como listas em linhas :
A [1,2]
B [5,5,4]
C [6]
É possível fazer algo assim usando o grupo pandas?
Você pode fazer isso usando groupby
para agrupar na coluna de interesse e depois apply
list
para cada grupo:
In [1]: df = pd.DataFrame( {'a':['A','A','B','B','B','C'], 'b':[1,2,5,5,4,6]})
df
Out[1]:
a b
0 A 1
1 A 2
2 B 5
3 B 5
4 B 4
5 C 6
In [2]: df.groupby('a')['b'].apply(list)
Out[2]:
a
A [1, 2]
B [5, 5, 4]
C [6]
Name: b, dtype: object
In [3]: df1 = df.groupby('a')['b'].apply(list).reset_index(name='new')
df1
Out[3]:
a new
0 A [1, 2]
1 B [5, 5, 4]
2 C [6]
tuple
seguir a segunda resposta aqui: stackoverflow.com/questions/19530568/… . Consulte a segunda resposta em stackoverflow.com/questions/27439023/… para obter explicações.Se o desempenho for importante, desça para o nível numpy:
Testes:
fonte
.groupby([df.index.month, df.index.day])
invés de apenas.groupby('a')
?Uma maneira útil de conseguir isso seria:
Procure escrever Aggregations personalizadas: https://www.kaggle.com/akshaysehgal/how-to-group-by-aggregate-using-py
fonte
lambda args: f(args)
é equivalente af
agg(list)
. Veja também aqui .df.groupby('a').apply(list)
ou use com agg como parte de um dictdf.groupby('a').agg({'b':list})
. Você também pode usá-lo com o lambda (que eu recomendo), pois você pode fazer muito mais com ele. Exemplo:df.groupby('a').agg({'c':'first', 'b': lambda x: x.unique().tolist()})
que permite aplicar uma função de série à col c e uma função exclusiva e uma lista à col b.Como você estava dizendo, o
groupby
método de umpd.DataFrame
objeto pode fazer o trabalho.Exemplo
que fornece uma descrição dos grupos em índice.
Para obter elementos de grupos únicos, você pode fazer, por exemplo
fonte
Para resolver isso em várias colunas de um quadro de dados:
Esta resposta foi inspirada na resposta de Anamika Modi . Obrigado!
fonte
Use qualquer um dos seguintes
groupby
eagg
receitas.Para agregar várias colunas como listas, use um dos seguintes:
Para listar em grupo apenas uma única coluna, converta o grupo em um
SeriesGroupBy
objeto e, em seguida, chameSeriesGroupBy.agg
. Usar,fonte
groupby(..., sort=False)
. Aqui, não faria diferença, pois estou agrupando a coluna A, que já está classificada.df.groupby('a')['b'].agg(lambda x: list(set(x)))
Se procurar uma lista exclusiva ao agrupar várias colunas, isso provavelmente poderá ajudar:
fonte
Vamos usar
df.groupby
com lista eSeries
construtorfonte
É hora de usar em
agg
vez deapply
.Quando
Se você deseja que várias colunas sejam empilhadas na lista, resulte em
pd.DataFrame
Se você quiser uma coluna única na lista, resulte em
ps.Series
Observe que o resultado em
pd.DataFrame
é cerca de 10x mais lento do que o resultado emps.Series
quando você agrega apenas uma coluna, use-a no caso de várias colunas.fonte
Aqui eu agrupei elementos com "|" como separador
fonte
A maneira mais fácil de ver não conseguir a maioria das mesmas coisas, pelo menos para uma coluna que é semelhante à resposta de Anamika apenas com a sintaxe da tupla para a função agregada.
fonte