Tengo un marco de datos de pandas dfcomo:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Quiero agrupar por la primera columna y obtener la segunda columna como listas en filas :
A [1,2]
B [5,5,4]
C [6]
¿Es posible hacer algo así usando pandas groupby?
Tengo un marco de datos de pandas dfcomo:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Quiero agrupar por la primera columna y obtener la segunda columna como listas en filas :
A [1,2]
B [5,5,4]
C [6]
¿Es posible hacer algo así usando pandas groupby?
Puede hacer esto usando groupbypara agrupar en la columna de interés y luego apply listpara 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]
tupleseguir la segunda respuesta aquí: stackoverflow.com/questions/19530568/… . Consulte la segunda respuesta en stackoverflow.com/questions/27439023/… para obtener una explicación.Si el rendimiento es importante, baje al nivel numpy:
Pruebas:
fuente
.groupby([df.index.month, df.index.day])lugar de solo.groupby('a')?Una forma práctica de lograr esto sería:
Examine la escritura de agregaciones personalizadas: https://www.kaggle.com/akshaysehgal/how-to-group-by-aggregate-using-py
fuente
lambda args: f(args)es equivalente afagg(list)es suficiente. Ver también aquí .df.groupby('a').apply(list)o usarlo con agg como parte de un dictdf.groupby('a').agg({'b':list}). También podría usarlo con lambda (que recomiendo) ya que puede hacer mucho más con él. Ejemplo:df.groupby('a').agg({'c':'first', 'b': lambda x: x.unique().tolist()})que le permite aplicar una función de serie a col c y una función única y luego una lista a col b.Como decías, el
groupbymétodo de unpd.DataFrameobjeto puede hacer el trabajo.Ejemplo
que proporciona una descripción de los grupos basada en índices.
Para obtener elementos de grupos individuales, puede hacer, por ejemplo
fuente
Para resolver esto para varias columnas de un marco de datos:
Esta respuesta se inspiró en la respuesta de Anamika Modi . ¡Gracias!
fuente
Use cualquiera de los siguientes
groupbyyaggrecetas.Para agregar varias columnas como listas, use cualquiera de los siguientes:
Para hacer una lista grupal de una sola columna, convierta el groupby en un
SeriesGroupByobjeto, luego llameSeriesGroupBy.agg. Utilizar,fuente
groupby(..., sort=False). Aquí, no habría diferencia ya que estoy agrupando en la columna A que ya está ordenada.df.groupby('a')['b'].agg(lambda x: list(set(x)))Si busca una lista única mientras agrupa varias columnas, esto probablemente podría ayudar:
fuente
Vamos a usar
df.groupbycon lista ySeriesconstructorfuente
Es hora de usar en
agglugar deapply.Cuando
Si desea que varias columnas se apilen en la lista, obtenga
pd.DataFrameSi quieres una sola columna en la lista, da como resultado
ps.SeriesTenga en cuenta que el resultado
pd.DataFramees aproximadamente 10 veces más lento queps.Seriescuando solo agrega una sola columna, úsela en mayúsculas y minúsculas.fuente
Aquí he agrupado elementos con "|" como separador
fuente
La forma más fácil que he visto no es lograr la mayor parte de lo mismo al menos para una columna que es similar a la respuesta de Anamika solo con la sintaxis de tupla para la función agregada.
fuente