es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo comparar celdas con formatos de cadena en un archivo .csv y devolver las cinco mayores en Python.

Estoy extrayendo información de una página web y obteniendo una lista de autores con sus tarifas. Guardé los datos en un archivo .csv y ahora me gustaría procesar los datos recolectados y crear una lista de los 5 autores mejor calificados.

Aquí está cómo se ve el archivo .csv:
aquí

Esto es lo que he hecho hasta ahora:

import csv

with open('goodreads-book.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file)
    next(csv_reader)

    with open("TopFiveRatedAuthors.csv", 'w') as new_file:
        for line in csv_reader:
            rate = line[1]
            rate = rate[19:-8]
            if (rate) > ('100,000'):
                t = line
                csv_writer = csv.writer(new_file)
                csv_writer.writerow(line)

Mi pregunta es en la línea:

if str(rate) > '100,000':

Actualmente devuelve algunas celdas al azar, sin embargo, me gustaría escribir un código aquí para comparar las celdas dinámicamente y solo devolver las mejor calificadas. Soy bastante nuevo en este tema y agradecería mucho cualquier ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear una lista de los 5 autores más valorados a partir de los datos recopilados, puedes hacer lo siguiente:

    1. Crear un diccionario para almacenar los nombres de los autores y sus puntuaciones.
    2. Recorrer cada fila en el archivo CSV y actualizar el diccionario con la puntuación para cada autor.
    3. Ordenar el diccionario por valor en orden descendente.
    4. Escribir los 5 autores principales y sus puntuaciones en un nuevo archivo CSV.

    Aquí está el código modificado con estos pasos implementados:

    import csv
    
    # Paso 1: Crear un diccionario para almacenar los nombres de los autores y sus puntuaciones
    autores = {}
    
    with open('goodreads-book.csv', 'r') as archivo_csv:
        lector_csv = csv.reader(archivo_csv)
    
        next(lector_csv)
    
        # Paso 2: Recorrer cada fila y actualizar el diccionario de autores
        for linea in lector_csv:
            autor = linea[0]
            puntuacion = linea[1]
            puntuacion = float(puntuacion[19:-8].replace(',', ''))  # convertir cadena a flotante
    
            if autor in autores:
                autores[autor] += puntuacion
            else:
                autores[autor] = puntuacion
    
    # Paso 3: Ordenar el diccionario por valor en orden descendente
    autores_top = sorted(autores.items(), key=lambda x: x[1], reverse=True)[:5]
    
    # Paso 4: Escribir los 5 autores en un nuevo archivo CSV
    with open("TopCincoAutoresValorados.csv", 'w', newline='') as nuevo_archivo:
        escritor_csv = csv.writer(nuevo_archivo)
        escritor_csv.writerow(['Autor', 'Puntuación Total'])
    
        for autor, puntuacion in autores_top:
            escritor_csv.writerow([autor, puntuacion])
    

    Explicación:

    • En el paso 2, extraemos el nombre del autor y la puntuación de cada fila y actualizamos el diccionario autores. Si el autor ya existe en el diccionario, sumamos la nueva puntuación a su puntuación existente. Si no, agregamos el autor y su puntuación al diccionario.
    • En el paso 3, ordenamos el diccionario autores por valor (la puntuación total) en orden descendente y solo mantenemos los 5 autores principales mediante el uso de segmentación de listas.
    • En el paso 4, escribimos los 5 autores principales y sus puntuaciones totales en un nuevo archivo CSV llamado “TopCincoAutoresValorados.csv”. Primero escribimos la fila del encabezado, luego recorremos los autores principales y escribimos el nombre de cada autor y su puntuación total en una nueva fila.

    Ten en cuenta que convertimos la puntuación de una cadena a un flotante y eliminamos las comas en el paso 2 para poder comparar las puntuaciones numéricamente.

Comments are closed.