Tengo un marco de datos de pandas df
como:
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 df
como:
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 groupby
para agrupar en la columna de interés y luego 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 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 af
agg(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
groupby
método de unpd.DataFrame
objeto 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
groupby
yagg
recetas.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
SeriesGroupBy
objeto, 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.groupby
con lista ySeries
constructorfuente
Es hora de usar en
agg
lugar deapply
.Cuando
Si desea que varias columnas se apilen en la lista, obtenga
pd.DataFrame
Si quieres una sola columna en la lista, da como resultado
ps.Series
Tenga en cuenta que el resultado
pd.DataFrame
es aproximadamente 10 veces más lento queps.Series
cuando 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