No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Filtros y Joins en DataFrames con Python

17/25
Recursos

¿Cómo eliminar medallas no deseadas de un DataFrame?

Si trabajas con datos de resultados olímpicos, es vital poder filtrar las medallas que no necesitas en tu análisis, centrándote solo en los resultados de oro, plata y bronce. Para esto, puedes lograr una limpieza eficiente del DataFrame que contiene esta información, eliminando las filas con valores que no sean medallas ganadas.

resultado_df = resultado_df[resultado_df['medalla'].notnull()]

Este fragmento de código te ayudará a deshacerte de las entradas no deseadas, manteniendo únicamente las medallas relevantes.

¿Cómo realizar un Join de DataFrames en Python?

El siguiente paso recae en cruzar, o "realizar un Join", entre diferentes DataFrames para obtener información más completa y detallada. Comienza con los DataFrames de deportistas olímpicos y resultados.

  • Join con deportistas olímpicos: Cruza los DataFrames deportista_olimpico_df y resultado_df usando la clave deportista_id.
merged_df = pd.merge(resultado_df, deportista_olimpico_df, on="deportista_id", how='left')

No olvides especificar el tipo de Join, en este caso un left join, para asegurarte de que el DataFrame de resultados contenga toda la información relevante.

  • Join con países: A continuación, cruza el DataFrame resultante con el de países. Compara la columna equipo_id con id de países.
merged_df = pd.merge(merged_df, paises_df, left_on="equipo_id", right_on="id", how='left')

Este left join te proporciona un resultado completo, integrando datos de los atletas y los países que representan.

¿Cómo seleccionar columnas específicas y ordenar resultados?

A la hora de trabajar con grandes volúmenes de datos, tener la capacidad de filtrar solo las columnas relevantes es esencial para mantener el análisis claro y manejable. Al mismo tiempo, la organización y el orden influyen en la comprensión de la información.

Selección de columnas

Es común que solo desees visualizar ciertas partes del DataFrame final. Esto se hace seleccionando las columnas específicas que consideras cruciales, como medalla, equipo y sigla.

final_df = merged_df[['medalla', 'equipo', 'sigla']]

Esta línea te mostrará únicamente las columnas esenciales para tu análisis, facilitando así su interpretación.

Ordenación de los resultados

Puedes aplicar un orden específico a tu DataFrame para clarificar aún más los datos. Por ejemplo, ordenar por la columna de sigla.

final_df.sort_values(by='sigla', ascending=True, inplace=True)

Con este comando, los resultados se muestran organizados alfabéticamente según sus siglas, pero puedes cambiar el orden a descendente si lo necesitas.

¡Y ahí lo tienes! Una potente y flexible manera de manejar grandes conjuntos de datos en Python usando los Joins y filtrados adecuados. Sigue practicando y analizando tus resultados para pulir tus habilidades. Cada consulta es un paso hacia la maestría. No dudes en compartir tus dudas o hallazgos. ¡A aprender se ha dicho!

Aportes 12

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Note que hay duplicados en el resultado, por lo que le agregue la function distinct()

resultadosDF.join(deportistaOlimpicoDF,\
                 deportistaOlimpicoDF.deportista_id == resultadosDF.deportista_id,
                 "left").join(
                 paisesDF, paisesDF.equipo_id == deportistaOlimpicoDF.equipo_id, 
                 "left").select("medalla", "equipo","sigla").\
                 where(resultadosDF.medalla != "NA").distinct().\
                 sort(col("sigla").desc()).show(20)
+-------+--------------------+-----+
|medalla|              equipo|sigla|
+-------+--------------------+-----+
| Silver|            Zimbabwe|  ZIM|
| Bronze|            Zimbabwe|  ZIM|
|   Gold|            Zimbabwe|  ZIM|
| Silver|              Zambia|  ZAM|
|   Gold|          Yugoslavia|  YUG|
| Silver|          Yugoslavia|  YUG|
| Bronze|          Yugoslavia|  YUG|
| Bronze|West Indies Feder...|  WIF|
| Silver|             Vietnam|  VIE|
|   Gold|             Vietnam|  VIE|
|   Gold|           Venezuela|  VEN|
| Bronze|           Venezuela|  VEN|
| Silver|           Venezuela|  VEN|```

Tengo la duda respecto a respetar PEP8 y la recomendación de que los JOIN se deben escribir en una sola línea, en mi caso aunque resolví el reto anterior igual tome la parte que hizo el profesor, aquí mi aporte

resultadoDF.filter(resultadoDF.medalla != "NA") \
    .join(
        deportistaOlimpicoDF,
        resultadoDF.deportista_id == deportistaOlimpicoDF.deportista_id,
        "left"
    ) \
    .join(
        paisesDF,
        deportistaOlimpicoDF.equipo_id == paisesDF.id,
        "left"
    ) \
    .select("medalla", paisesDF.equipo, paisesDF.sigla) \
    .sort(col("sigla").desc()) \
    .show()

Yo noté que si los ordenamos de manera ascendente existen datos en País y Nombre del equipo “null” por lo que guardé todo el código del profe en una variable llamada " retoClase16 " y le agregué este filtro al final:


retoClase16.filter( (retoClase16.País != "null")).show()
+-------+--------------------+----+
|medalla|   Nombre del equipo|País|
+-------+--------------------+----+
| Bronze|         Afghanistan| AFG|
| Bronze|         Afghanistan| AFG|
| Silver|Netherlands Antilles| AHO|
|   Gold|             Albania| ALB|
| Bronze|             Albania| ALB|
| Silver|             Albania| ALB|
| Silver|             Algeria| ALG|
| Bronze|             Algeria| ALG|
|   Gold|             Algeria| ALG|
| Silver|             Algeria| ALG|
| Bronze|             Algeria| ALG|
|   Gold|             Algeria| ALG|
| Bronze|             Algeria| ALG|
| Bronze|             Algeria| ALG|
|   Gold|             Algeria| ALG|
| Silver|             Algeria| ALG|
| Bronze|             Algeria| ALG|
|   Gold|             Algeria| ALG|
| Bronze|             Algeria| ALG|
| Bronze|             Algeria| ALG|
+-------+--------------------+----+
only showing top 20 rows

Les comparto una captura de mi salida.

Solución con sort

deportistasDF.join(resultadosDF, deportistasDF.deportista_id == resultadosDF.deportista_id, "left") \
.join(paisesDF, paisesDF.id == deportistasDF.equipo_id, "left") \
.select(
    "medalla", 
    col("sigla").alias("pais"),
    "equipo"
) \
.where(resultadosDF.medalla != "NA") \
.sort(col("sigla").asc()).show()

Hice un TOP 10 de los quipos con más y con menos medallas ganadas
Llevo 6 Años desde que aprendí SQL y hoy en día trato de utilizarlo y de llevarlo en cada cosa que aprendo y esto es prueba de ello (Spark y SQL ❤)

Hola a todos, agregue un groupby para mejorar la lectura y saber cuantas medalla por pais hay.

resultadoDF.filter(resultadoDF.medalla != "NA") \
    .join(deportistaOlimpicoDF,deportistaOlimpicoDF.deportista_id == resultadoDF.deportista_id,"left") \
    .join(paisesDF,paisesDF.id == deportistaOlimpicoDF.equipo_id, "left") \
    .select("medalla", "equipo","sigla").groupBy("medalla", "equipo").count().sort( col("count").desc() ).show()

Este curso no me gustó mucho por varios factores, uno de los principales es que siempre obtenía errores en los archivos, no sé si es que en el github los modificaron pero me la he paso es resolviendo errores y modificando cosas para poder seguir el curso bien, por último opté por ver las clases sin seguir nada y estudiar spark por aparte, con algún curso introductorio de YouTube.

También debe corregir algunas cositas de las convenciones python, pero esto son detalles menores.

Comparto mi solución.

Esta fue mi solución, en vez de usar “filter”, usé un “where”:

deportistasDF\
  .join(
      resultadosDF,
      deportistasDF.deportista_id == resultadosDF.deportista_id,
      "left"
    ) \
  .join(
    equiposDF,
    deportistasDF.equipo_id == equiposDF.id,
    "left"
    ) \
  .where(resultadosDF.medalla != 'NA') \
  .select(deportistasDF.nombre,
          "edad_al_jugar",
          "medalla",
          equiposDF.equipo,
          col("sigla").alias("pais_equipo")
         ) \
  .show()

Agregué un nuevo csv en la carpeta files donde detalla los campos y los valores de la tabla género del MR , pero cuando quiero mostrar el contenido del csv en jupyter, me arroja un error indicando que spark no encontró el archivo, entonces hice un Dir para ver el contenido de la carpeta files (Ya que uso windows) y resulta que que no me muestra este archivo, o como que no lo reconoce spark, aunque el archivo esta guardado físicamente en files. A alguien más le pasa esto ? o hay una forma de crear o guardar archivos para que spark los reconozca ??

muy interesante