En la etiqueta de pandas , a menudo veo a los usuarios haciendo preguntas sobre la fusión de marcos de datos en pandas. Voy a intentar una sesión de preguntas y respuestas canónicas (auto-respuesta) con este tema.
Voy a aclarar:
¿Qué es derretir?
¿Cómo uso el derretimiento?
¿Cuándo uso melt?
Veo algunas preguntas más candentes sobre el derretimiento, como:
Los pandas convierten algunas columnas en filas : esta en realidad podría ser buena, pero sería mejor una explicación más.
Función de fusión de pandas : la buena respuesta de la pregunta es buena, pero es un poco vaga, no hay mucha expansión.
Fusión de un marco de datos de pandas : ¡también una buena respuesta! Pero es solo para esa situación en particular, que es bastante simple, solo pd.melt(df)
El marco de datos de Pandas usa columnas como filas (fundido) : ¡Muy ordenado! Pero el problema es que es solo para la pregunta específica que hizo el OP, que también se requiere para usar pivot_table también.
Así que voy a intentar una sesión de preguntas y respuestas canónicas para este tema.
Tendré todas mis respuestas en este conjunto de datos de calificaciones aleatorias para personas aleatorias con edades aleatorias (más fácil de explicar para las respuestas: D):
import pandas as pd df = pd.DataFrame({'Name': ['Bob', 'John', 'Foo', 'Bar', 'Alex', 'Tom'], 'Math': ['A+', 'B', 'A', 'F', 'D', 'C'], 'English': ['C', 'B', 'B', 'A+', 'F', 'A'], 'Age': [13, 16, 16, 15, 15, 13]}) >>> df Name Math English Age 0 Bob A+ C 13 1 John BB 16 2 Foo AB 16 3 Bar F A+ 15 4 Alex DF 15 5 Tom CA 13 >>>Voy a tener algunos problemas y se resolverán en mi auto-respuesta a continuación.
¿Cómo derrito un marco de datos para que el marco de datos original se convierta en:
Name Age Subject Grade 0 Bob 13 English C 1 John 16 English B 2 Foo 14 English B 3 Bar 15 English A+ 4 Alex 17 English F 5 Tom 12 English A 6 Bob 13 Math A+ 7 John 16 Math B 8 Foo 14 Math A 9 Bar 15 Math F 10 Alex 17 Math D 11 Tom 12 Math CQuiero transponer esto para que una columna sea cada materia y las otras columnas sean los nombres repetidos de los estudiantes y su edad y puntuación.
Esto es similar al Problema 1, pero esta vez quiero hacer que la columna Subject de salida del Problema 1 solo tenga Math , quiero filtrar la columna en English :
Name Age Subject Grades 0 Bob 13 Math A+ 1 John 16 Math B 2 Foo 16 Math A 3 Bar 15 Math F 4 Alex 15 Math D 5 Tom 13 Math CQuiero que la salida sea como la anterior.
Si tuviera que agrupar el derretimiento y ordenar a los estudiantes por sus puntajes, ¿cómo podría hacerlo para obtener el resultado deseado como el siguiente?
value Name Subjects 0 A Foo, Tom Math, English 1 A+ Bob, Bar Math, English 2 B John, John, Foo Math, English, English 3 C Tom, Bob Math, English 4 D Alex Math 5 F Bar, Alex Math, English Necesito que este ordenado y los nombres separados por coma y tambien los Subjects separados por coma en el mismo orden respectivamente
¿Cómo desharía un marco de datos derretido? Digamos que ya derretí este marco de datos:
print(df.melt(id_vars=['Name', 'Age'], var_name='Subject', value_name='Grades'))Convertirse:
Name Age Subject Grades 0 Bob 13 Math A+ 1 John 16 Math B 2 Foo 16 Math A 3 Bar 15 Math F 4 Alex 15 Math D 5 Tom 13 Math C 6 Bob 13 English C 7 John 16 English B 8 Foo 16 English B 9 Bar 15 English A+ 10 Alex 15 English F 11 Tom 13 English AEntonces, ¿cómo traduciría esto de nuevo al marco de datos original, el siguiente:
Name Math English Age 0 Bob A+ C 13 1 John BB 16 2 Foo AB 16 3 Bar F A+ 15 4 Alex DF 15 5 Tom CA 13¿Cómo haría para hacer esto?
Si tuviera que agrupar por los nombres de los alumnos y separar las materias y calificaciones por comas, ¿cómo lo haría?
Name Subject Grades 0 Alex Math, English D, F 1 Bar Math, English F, A+ 2 Bob Math, English A+, C 3 Foo Math, English A, B 4 John Math, English B, B 5 Tom Math, English C, AQuiero tener un marco de datos como el anterior.
Si fuera a derretir por completo mi marco de datos, todas las columnas como valores, ¿cómo lo haría?
Column Value 0 Name Bob 1 Name John 2 Name Foo 3 Name Bar 4 Name Alex 5 Name Tom 6 Math A+ 7 Math B 8 Math A 9 Math F 10 Math D 11 Math C 12 English C 13 English B 14 English B 15 English A+ 16 English F 17 English A 18 Age 13 19 Age 16 20 Age 16 21 Age 15 22 Age 15 23 Age 13Quiero tener un marco de datos como el anterior. Todas las columnas como valores.