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.

Encuentra las dos filas superiores e inferiores y lee los valores de las columnas en un dataframe en Python.

Este es mi marco de datos de muestra.

df = pd.DataFrame({'Nombre':['Matt', 'John', 'Sam', 'Harry', 'Don', 'Julia', 'Chris', 'Nelson'],
'Edad': [30, 34, 56, 43, 67, 23, 19, 8],
'Calificaciones': [100, 200, 434, 543, 234, 412, 678, 832],
'Peso': [89, 56, 74, 34, 98, 102, 71, 80]})

Necesito encontrar los dos valores más altos y los dos más bajos por columna y devolver el nombre y los valores correspondientes de esas filas. Puedo obtenerlos individualmente, pero ¿hay alguna forma de obtenerlos todos juntos en una tabla con un solo código?

Este es el resultado de muestra que estoy buscando (una tabla para los valores más altos y otra para los valores más bajos). La siguiente tabla es para los valores más altos.

Nombre de columna Nombre Ranking Valor
Edad Don 1 67
Edad Sam 2 56
Calificaciones Nelson 1 832
Calificaciones Chris 2 678

Hay más de 80 columnas. Soy nuevo en Python y algún tipo de bucle sería realmente útil.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes lograr esto utilizando un bucle en Python. Aquí tienes un código de ejemplo que logra lo que necesitas:

    import pandas as pd
    
    # crear un marco de datos de ejemplo
    df = pd.DataFrame({'Nombre': ['Matt', 'John', 'Sam', 'Harry', 'Don', 'Julia', 'Chris', 'Nelson'],
                       'Edad': [30, 34, 56, 43, 67, 23, 19, 8],
                       'Notas': [100, 200, 434, 543, 234, 412, 678, 832],
                       'Peso': [89, 56, 74, 34, 98, 102, 71, 80]})
    
    # inicializar un marco de datos vacío para almacenar los resultados
    result_df = pd.DataFrame(columns=['Nombre de la Columna', 'Nombre', 'Rango', 'Valor'])
    
    # iterar a través de cada columna en el marco de datos
    for col in df.columns:
        if col != 'Nombre':
            # obtener los índices de los dos valores más altos y los dos valores más bajos en la columna
            top_indices = df[col].nlargest(2).index.tolist()
            bottom_indices = df[col].nsmallest(2).index.tolist()
    
            # agregar las filas para los valores más altos a result_df
            for i, index in enumerate(top_indices):
                nombre = df.loc[index, 'Nombre']
                rango = i + 1
                valor = df.loc[index, col]
                result_df = result_df.append({'Nombre de la Columna': col, 'Nombre': nombre, 'Rango': rango, 'Valor': valor}, ignore_index=True)
    
            # agregar las filas para los valores más bajos a result_df
            for i, index in enumerate(bottom_indices):
                nombre = df.loc[index, 'Nombre']
                rango = i + 1
                valor = df.loc[index, col]
                result_df = result_df.append({'Nombre de la Columna': col, 'Nombre': nombre, 'Rango': rango, 'Valor': valor}, ignore_index=True)
    
    # imprimir el resultado final en result_df
    print(result_df)
    

    Este código primero inicializa un marco de datos vacío result_df que almacenará el resultado final. Luego itera a través de cada columna en el marco de datos de entrada df e identifica los dos valores más altos y los dos valores más bajos para cada columna utilizando las funciones nlargest y nsmallest de la biblioteca pandas. Luego extrae el Nombre, Rango y Valor correspondientes para cada uno de estos valores y agrega una nueva fila al marco de datos result_df. Finalmente, el código imprime el marco de datos result_df que contiene el formato de salida deseado.

    Ten en cuenta que este código asume que la columna Nombre es siempre la primera columna en el marco de datos de entrada, y que todas las demás columnas contienen valores numéricos. Si tu marco de datos de entrada tiene una estructura diferente, es posible que debas modificar el código en consecuencia.

Comments are closed.