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.

Necesito dividir datos en una base de datos CSV utilizando pandas en Python y escribirlos en un archivo XLSX con varias hojas, además de crear una columna adicional.

Tengo una base de datos (accesible: https://datacatalog.worldbank.org/search/dataset/0041443/World—Global-Tracking-Framework, descarga el archivo CSV “Renewable Energy Indicator Results”) con la que necesito trabajar y manipular. El objetivo es importar la base de datos en Python con pandas, eliminar 2 columnas, agregar una columna adicional al final con el contenido que sea un promedio de la cantidad de datos recopilados durante 24 años (1990-2014). Una vez hecho esto, la primera columna debe ser el nombre de la serie compuesto por [‘Consumo total final de energía (TFEC) (TJ)’, ‘Participación de energía renovable en el consumo total final de energía (%)’, ‘Consumo de energía renovable (TJ)’, ‘Participación de la electricidad renovable en la producción total de electricidad (%)’, ‘Producción total de electricidad (GWh)’, ‘Producción de electricidad renovable (GWh)’], luego los nombres de los países y luego los datos de los años 1990-2014 y el promedio. El problema que tengo es que los datos están divididos en dos columnas, primero por nombre de serie y luego por país. Me gustaría exportar estos datos a un archivo xlsx en el que el archivo de Excel tenga 6 hojas, cada hoja que contenga los datos relativos al nombre de la serie. Es decir, una hoja para el consumo total final de energía (TFEC) (TJ) donde la primera columna sean los nombres de los países y luego los datos de los años posteriores, y lo mismo para las otras series.

Soy nuevo en la programación y estoy encontrando dificultades para encontrar soluciones a este problema hasta ahora. A continuación está el código que he logrado crear hasta ahora. P.S. Estoy utilizando Jupyter Notebook para programar.

1: import pandas as pd
2: df = pd.read_csv('gtfrenewableenergydata.csv')
3: df.drop(['Series Code', 'Country Code'], inplace=True, axis=1)
4: df.insert(27, "Promedio Total", df.mean(axis=1))
5: my_writer = pd.ExcelWriter('ProyectoExcel.xlsx', engine='xlsxwriter')
6: df.to_excel(my_writer, sheet_name='Proyecto de Energía Renovable', index=False)
7: my_writer.save()

Sé que en la línea 4 el código es incorrecto, ya que la nueva columna está produciendo NaN en lugar del promedio de los 24 años. También no tengo ningún código para dividir los datos en múltiples hojas, ya que aún no puedo resolver ese problema.

¡CUALQUIER AYUDA SERÍA MUY APRECIADA!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para calcular el promedio de los 24 años de datos, necesitas seleccionar solo las columnas con los datos (años 1990-2014), por lo que puedes utilizar el método de filtro de pandas para seleccionar las columnas relevantes:

    datos_anuales = df.filter(regex='^[1-2]\d{3}$', axis=1)
    

    Esto seleccionará todas las columnas que comienzan con un número del 1 al 2, seguido de 3 dígitos, que corresponden a los años 1990-2014.

    Luego, puedes calcular el valor promedio de cada fila utilizando el método mean a lo largo del eje 1:

    df['Promedio Total'] = datos_anuales.mean(axis=1)
    

    Esto calculará el valor promedio para cada fila (es decir, para cada país e indicador).

    Para dividir los datos en múltiples hojas según el nombre del indicador, puedes utilizar el método groupby de pandas:

    grupos = df.groupby('Nombre de la Serie')
    
    for nombre, grupo in grupos:
        # Seleccionar solo las columnas relevantes (nombre de la serie, nombres de los países, años y promedio)
        datos = grupo[['Nombre de la Serie', 'Nombre del País'] + datos_anuales.columns.tolist() + ['Promedio Total']]
        # Eliminar la columna duplicada del nombre de la serie
        datos = datos.drop('Nombre de la Serie', axis=1)
        # Escribir los datos en una hoja con el nombre del indicador
        datos.to_excel(my_writer, sheet_name=nombre, index=False)
    

    Esto agrupará el dataframe por la columna “Nombre de la Serie” y recorrerá cada grupo. Para cada grupo, seleccionará las columnas relevantes, eliminará la columna duplicada del nombre de la serie y escribirá los datos en una hoja con el nombre del indicador.

    El código final se vería así:

    import pandas as pd
    
    df = pd.read_csv('gtfrenewableenergydata.csv')
    
    # Seleccionar solo las columnas relevantes (nombre de la serie, nombres de los países, años y promedio)
    datos_anuales = df.filter(regex='^[1-2]\d{3}$', axis=1)
    df = df[['Nombre de la Serie', 'Nombre del País'] + datos_anuales.columns.tolist()]
    
    # Calcular el valor promedio para cada fila
    df['Promedio Total'] = datos_anuales.mean(axis=1)
    
    # Dividir los datos en múltiples hojas según el nombre del indicador
    grupos = df.groupby('Nombre de la Serie')
    
    my_writer = pd.ExcelWriter('ProyectoExcel.xlsx', engine='xlsxwriter')
    
    for nombre, grupo in grupos:
        # Seleccionar solo las columnas relevantes (nombre de la serie, nombres de los países, años y promedio)
        datos = grupo[['Nombre de la Serie', 'Nombre del País'] + datos_anuales.columns.tolist() + ['Promedio Total']]
        # Eliminar la columna duplicada del nombre de la serie
        datos = datos.drop('Nombre de la Serie', axis=1)
        # Escribir los datos en una hoja con el nombre del indicador
        datos.to_excel(my_writer, sheet_name=nombre, index=False)
    
    my_writer.save()
    

Comments are closed.