Estoy empezando con datos de entrada como este
df1 = pandas.DataFrame( {
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )
Que cuando se imprime aparece así:
City Name
0 Seattle Alice
1 Seattle Bob
2 Portland Mallory
3 Seattle Mallory
4 Seattle Bob
5 Portland Mallory
La agrupación es bastante simple:
g1 = df1.groupby( [ "Name", "City"] ).count()
e imprimir produce un GroupBy
objeto:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Seattle 1 1
Pero lo que quiero eventualmente es otro objeto DataFrame que contenga todas las filas en el objeto GroupBy. En otras palabras, quiero obtener el siguiente resultado:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Mallory Seattle 1 1
No puedo ver cómo lograr esto en la documentación de los pandas. Cualquier sugerencia sería bienvenida.
python
pandas
dataframe
pandas-groupby
multi-index
saveenr
fuente
fuente
Empty DataFrame
Columns: []
Index: [(Alice, Seattle), (Bob, Seattle), (Mallory, Portland), (Mallory, Seattle)]
Respuestas:
g1
Aquí hay un DataFrame. Sin embargo, tiene un índice jerárquico:¿Quizás quieres algo como esto?
O algo como:
fuente
reset.index()
hace el trabajo, genial!df1.groupby( [ "Name", "City"] ).size().to_frame(name = 'count').reset_index()
.reset_index()
me parece ser la mejor manera de unir la salida que obtendrádf.groupby('some_column').apply(your_custom_func)
. Esto no fue intuitivo para mí.pandas.core.groupby.DataFrameGroupBy
objeto, nopandas.core.frame.DataFrame
.Quiero cambiar ligeramente la respuesta dada por Wes, porque requiere la versión 0.16.2
as_index=False
. Si no lo configura, obtendrá un marco de datos vacío.Fuente :
EDITAR:
En la versión
0.17.1
y posteriores puede usarsubset
encount
yreset_index
con parámetroname
ensize
:La diferencia entre
count
ysize
es quesize
cuenta los valores de NaN mientrascount
que no.fuente
df1.groupby( [ "Name", "City"]).size().reset_index(name="count")
as_index=False' stopped working in latest versions? I also tried to run
df1.groupby (["Nombre", "Ciudad"], as_index = False) .size () `pero no afecta el resultado (probablemente porque el resultado de la agrupaciónSeries
no esDataFrame
groupby
por estas columnas. Pero no estoy seguro, porque no soy desarrollador de pandas.Simplemente, esto debería hacer la tarea:
Aquí,
grouped_df.size()
muestra el recuento de grupo único y elreset_index()
método restablece el nombre de la columna que desea que sea. Finalmente,Dataframe()
se llama a la función pandas para crear un objeto DataFrame.fuente
La clave es usar el método reset_index () .
Utilizar:
Ahora tiene su nuevo marco de datos en g1 :
fuente
Tal vez no entiendo bien la pregunta, pero si desea convertir el grupo de nuevo a un marco de datos, puede usar .to_frame (). Quería restablecer el índice cuando hice esto, así que también incluí esa parte.
código de ejemplo no relacionado con la pregunta
fuente
Encontré que esto funcionó para mí.
fuente
La siguiente solución puede ser más simple:
fuente
Me agregué con Cantidad sabia de datos y almaceno a marco de datos
fuente
Estas soluciones solo funcionaron parcialmente para mí porque estaba haciendo múltiples agregaciones. Aquí hay una salida de muestra de mi agrupada por la que quería convertir a un marco de datos:
Como quería más que el recuento proporcionado por reset_index (), escribí un método manual para convertir la imagen de arriba en un marco de datos. Entiendo que esta no es la forma más pitónica / panda de hacer esto, ya que es bastante detallada y explícita, pero era todo lo que necesitaba. Básicamente, use el método reset_index () explicado anteriormente para iniciar un marco de datos de "andamiaje", luego recorra los emparejamientos de grupo en el marco de datos agrupado, recupere los índices, realice sus cálculos contra el marco de datos desagrupado y establezca el valor en su nuevo marco de datos agregado .
Si un diccionario no es lo tuyo, los cálculos podrían aplicarse en línea en el ciclo for:
fuente