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 transformar un dataframe de pandas que contiene columnas booleanas en una tabla compatible con un mapa de calor?

Tengo una tabla algo parecida a esta:

A B C
1 1 1 1
2 0 1 1
3 0 0 1

Donde cada celda contiene si la fila está conectada a la columna especificada.

Quiero transformar esto en una tabla como esta:

A B C
A 1 1 1
B 1 2 2
C 1 2 3

Donde cada celda contiene el número de filas (de la tabla original) que están conectadas tanto a la columna específica como al nombre de fila en la segunda tabla.

Por ejemplo, el 3 en la segunda tabla significa que hay 3 filas en la tabla original que están conectadas a las columnas B y C.

El objetivo es graficar un mapa de calor a partir de la segunda tabla usando plotly.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para transformar la tabla original en la tabla deseada, puedes utilizar la función melt de pandas y luego agrupar por los nombres de las columnas y contar el número de ocurrencias para cada combinación de filas y columnas. El código para esta transformación se vería así:

    import pandas as pd
    
    # crear la tabla original
    df = pd.DataFrame({'A': [1, 0, 0], 'B': [1, 1, 0], 'C': [1, 1, 1]})
    
    # utilizar la función melt de pandas para transformar la tabla
    melted_df = pd.melt(df.reset_index(), id_vars=['index'], value_vars=['A', 'B', 'C'])
    melted_df = melted_df[melted_df['value'] == 1]
    
    # agrupar la tabla transformada por los nombres de las columnas y contar las ocurrencias
    grouped_df = melted_df.groupby(['variable', 'index'])['value'].count()
    final_df = grouped_df.unstack('variable').fillna(0)
    
    # renombrar los nombres de fila y columna para que coincidan con la tabla deseada
    final_df.index.name = 'A/B/C'
    final_df.columns.name = 'A/B/C'
    final_df.columns = final_df.columns.map(lambda c: c if c != 'index' else 'count')
    
    print(final_df)
    

    Esto dará como resultado la tabla deseada:

    A/B/C  A    B    C   
    A       1.0  1.0  1.0
    B       1.0  2.0  2.0
    C       1.0  2.0  3.0
    

    Para plotear el mapa de calor utilizando plotly, puedes utilizar la clase go.Heatmap del módulo plotly.graph_objs. El código para esto se vería así:

    import plotly.graph_objs as go
    
    trace = go.Heatmap(z=final_df.values.tolist(),
                       x=final_df.columns.tolist(),
                       y=final_df.index.tolist())
    data = [trace]
    layout = {'height': 400, 'width': 400}
    fig = {'data': data, 'layout': layout}
    
    # mostrar el gráfico en un Jupyter notebook
    from plotly.offline import iplot
    iplot(fig)
    

    Esto mostrará el mapa de calor en la salida del Jupyter notebook.

Comments are closed.