Hacer Matplotlib Ignorar los encabezados

Mi amigo está tratando de hacer un gráfico usando el python importación matplotlib y un archivo CSV que le he dado. Sin embargo, el CSV que le he dado incluye partidas (COUNTRY, COST) por lo que el programa de py no puede funcionar correctamente. El error dice "no podría convertir la cadena a flotar". Aquí está su código un ejemplo de mi archivo. ¿Cómo puede hacer que el gráfico de barras ignore la primera fila del archivo CSV para que el código pueda ejecutar

Sample of the file, including the headings causing problems

import matplotlib.pyplot as plt
import csv

price = []
countries = []
    
with open ("CpremiumusersEurope.csv","r") as csvfile:
    plot = csv.reader(csvfile)
    for row in plot:
        price.append(float(row[1]))
        countries.append(str(row[0]))

plt.style.use('grayscale') 
plt.bar( countries, price, label='Europe', color='red')

plt.ylabel('Price in Europe ($)')
plt.title('Cost of spotify premium per country')
plt.xticks(rotation=90)

plt.legend(loc='best')
plt.show()

Pregunta hecha hace 3 años, 4 meses, 27 días - Por debugdragon


4 Respuestas:

  • Puede saltarse la primera fila así:

    for idx, row in enumerate(plot):
        if idx == 0:
            continue 
        price.append(float(row[1]))
        countries.append(str(row[0]))
    

    También podrías saltarlo de esta manera, que me gusta menos como es menos flexible.

    for row in plot:
        if row[1] == 'COST':
            continue 
        price.append(float(row[1]))
        countries.append(str(row[0]))
    

    Respondida el Dec 18, 2020 a las 13:32 - por binarybard

    Votos positivos: 0 | Votos negativos: 0

  • csv.reader devuelve un iteratorAsí puedes llamar siguiente on plot para avanzar a la siguiente fila:

    with open ("CpremiumusersEurope.csv","r") as csvfile:
        plot = csv.reader(csvfile)
        # Consume the first row from plot
        next(plot)
        # Now loop over the rest of the rows.
        for row in plot:
            price.append(float(row[1]))
            countries.append(str(row[0]))
    

    Respondida el Dec 18, 2020 a las 13:40 - por codeartisan

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando se debe a que estás intentando convertir la cadena de las cabeceras del archivo CSV a un número flotante, lo cual causa el error "no podría convertir la cadena a flotar". Para evitar este problema, puedes simplemente omitir la primera fila del archivo CSV que contiene las cabeceras.

    Para lograr esto, puedes modificar tu código de la siguiente manera:

    python
    import matplotlib.pyplot as plt
    import csv
    
    price = []
    countries = []
    
    with open("CpremiumusersEurope.csv", "r") as csvfile:
        plot = csv.reader(csvfile)
        next(plot)  

    Ignorar la primera fila que contiene las cabeceras

    for row in plot: price.append(float(row[1])) countries.append(str(row[0])) plt.style.use('grayscale') plt.bar(countries, price, label='Europe', color='red') plt.ylabel('Price in Europe ($)') plt.title('Cost of Spotify Premium per country') plt.xticks(rotation=90) plt.legend(loc='best') plt.show()

    Al agregar la línea next(plot) después de abrir el archivo CSV, el programa ignora la primera fila (que contiene los encabezados) y continúa leyendo los datos de la segunda fila en adelante. Esto debería solucionar tu problema y permitir que el código funcione correctamente.

    Respondida el Dec 19, 2020 a las 13:31 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para hacer que Matplotlib ignore la primera fila del archivo CSV, puedes usar el argumento skiprows en la función csv.reader(). Este argumento especifica el número de filas que se saltarán al leer el archivo.

    Aquí tienes el código modificado:

    python
    import matplotlib.pyplot as plt
    import csv
    
    price = []
    countries = []
    
    with open ("CpremiumusersEurope.csv","r") as csvfile:
        plot = csv.reader(csvfile, skiprows=1)
        for row in plot:
            price.append(float(row[1]))
            countries.append(str(row[0]))
    
    plt.style.use('grayscale') 
    plt.bar( countries, price, label='Europe', color='red')
    
    plt.ylabel('Price in Europe ($)')
    plt.title('Cost of spotify premium per country')
    plt.xticks(rotation=90)
    
    plt.legend(loc='best')
    plt.show()
    

    El argumento skiprows=1 le indica a csv.reader() que salte la primera fila del archivo CSV. Esto permitirá que tu código se ejecute correctamente y genere el gráfico de barras sin incluir los encabezados.

    Respondida el Dec 19, 2020 a las 13:45 - por Gemini

    Votos positivos: 0 | Votos negativos: 0