Plotly Dash DataTable:如何从 Pandas 多标头数据帧创建多标头表

Gal*_*lat 0 python dataframe pandas plotly-dash

这是通过 Dash 示例创建多标头表的示例:

\n
import dash\nimport dash_table\nimport pandas as pd\n\napp = dash.Dash(__name__)\n\napp.layout = dash_table.DataTable(\n    columns=[\n        {"name": ["", "Year"], "id": "year"},\n        {"name": ["City", "Montreal"], "id": "montreal"},\n        {"name": ["City", "Toronto"], "id": "toronto"},\n        {"name": ["City", "Ottawa"], "id": "ottawa"},\n        {"name": ["City", "Vancouver"], "id": "vancouver"},\n        {"name": ["Climate", "Temperature"], "id": "temp"},\n        {"name": ["Climate", "Humidity"], "id": "humidity"},\n    ],\n    data=[\n        {\n            "year": i,\n            "montreal": i * 10,\n            "toronto": i * 100,\n            "ottawa": i * -1,\n            "vancouver": i * -10,\n            "temp": i * -100,\n            "humidity": i * 5,\n        }\n        for i in range(10)\n    ],\n    merge_duplicate_headers=True,\n)\n\nif __name__ == \'__main__\':\n    app.run_server(debug=True)\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述\n我的 pandas 数据框的示例:

\n
data={(\'user_profile_id\', \'\'): {0: 968, 1: 969},\n (\'email\', \'\'): {0: \'aaaa@gmail.com\', 1: \'bbbbb@gmail.com\'},\n (\'results\', \'Cope\'): {0: 15, 1: 25},\n (\'results\', \'Baba\'): {0: 100, 1: 45},\n (\'results\', \'Susu\'): {0: 120, 1: 75},\n (\'results\', \'Zizi\'): {0: 150, 1: 52},\n (\'results\', \'Fufu\'): {0: 250, 1: 2},\n (\'feedback\', \'Cope\'): {0: \'Good\', 1: \'Didn\xe2\x80\x99t try it on\'},\n (\'feedback\', \'Baba\'): {0: \'Good\', 1: \'Didn\xe2\x80\x99t try it on\'},\n (\'feedback\', \'Susu\'): {0: \'Bad\', 1: \'Didn\xe2\x80\x99t try it on\'},\n (\'feedback\', \'Zizi\'): {0: \'Bad\', 1: \'Didn\xe2\x80\x99t try it on\'},\n (\'feedback\', \'Fufu\'): {0: \'Bad\', 1: \'Didn\xe2\x80\x99t try it on\'}\n}\ndf = pd.DataFrame.from_dict(data)\ndf\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

如何从我的 Pandas 多标头数据帧中制作 Dash 数据表多标头?

\n

pbs*_*bsb 5

你好,这是一个将数据帧转换为破折号格式的函数

def convert_df_to_dash(df):
    """
    Converts a pandas data frame to a format accepted by dash
    Returns columns and data in the format dash requires
    """

    # create ids for multi indexes (single index stays unchanged)
    # [('', 'A'), ('B', 'C'), ('D', 'E')] -> ['A', 'B_C', 'D_E']
    ids = ["".join([col for col in multi_col if col]) for multi_col in list(df.columns)]

    # build columns list from ids and columns of the dataframe
    cols = [{"name": list(col), "id": id_} for col, id_ in zip(list(df.columns), ids)]

    # build data list from ids and rows of the dataframe
    data = [{k: v for k, v in zip(ids, row)} for row in df.values]

    return cols, data
Run Code Online (Sandbox Code Playgroud)

pandas.columns它只是将和 的输出转换pandas.values为 Dash 所需的格式。由于需要唯一id,我只是加入了用下划线分隔的列名称。

这是我运行的一些测试的结果

请注意,对于单个索引列,该函数返回"name": [col_name]而不是"name": col_name。但 dash 可以很好地接受这一点,因此无需添加额外的检查。

############### TESTE 0 ###############
Dataframe:
   A  B  C
0  1  2  3
1  4  5  6
           df cols: ['A', 'B', 'C']
dash expected_cols: [{'name': 'A', 'id': 'A'}, {'name': 'B', 'id': 'B'}, {'name': 'C', 'id': 'D'}]
   calculated cols: [{'name': ['A'], 'id': 'A'}, {'name': ['B'], 'id': 'B'}, {'name': ['C'], 'id': 'C'}]
    

             df values: [array([1, 2, 3]), array([4, 5, 6])]
dash expected_data: [{'A': 1, 'B': 2, 'D': 3}, {'A': 4, 'B': 5, 'D': 6}]
   calculated data: [{'A': 1, 'B': 2, 'C': 3}, {'A': 4, 'B': 5, 'C': 6}]
    
############### TESTE 1 ###############
Dataframe:
      B  D
   A  C  E
0  1  2  3
1  4  5  6
           df cols: [('', 'A'), ('B', 'C'), ('D', 'E')]
dash expected_cols: [{'name': ['', 'A'], 'id': 'A'}, {'name': ['B', 'C'], 'id': 'B_C'}, {'name': ['D', 'E'], 'id': 'D_E'}]
   calculated cols: [{'name': ['', 'A'], 'id': 'A'}, {'name': ['B', 'C'], 'id': 'B_C'}, {'name': ['D', 'E'], 'id': 'D_E'}]
    

             df values: [array([1, 2, 3]), array([4, 5, 6])]
dash expected_data: [{'A': 1, 'B_C': 2, 'D_E': 3}, {'A': 4, 'B_C': 5, 'D_E': 6}]
   calculated data: [{'A': 1, 'B_C': 2, 'D_E': 3}, {'A': 4, 'B_C': 5, 'D_E': 6}]
    
############### TESTE 2 ###############
Dataframe:
      B  D
   A  C  E
   F  G  H
0  1  2  3
1  4  5  6
           df cols: [('', 'A', 'F'), ('B', 'C', 'G'), ('D', 'E', 'H')]
dash expected_cols: [{'name': ['', 'A', 'F'], 'id': 'A_F'}, {'name': ['B', 'C', 'G'], 'id': 'B_C_G'}, {'name': ['D', 'E', 'H'], 'id': 'D_E_H'}]
   calculated cols: [{'name': ['', 'A', 'F'], 'id': 'A_F'}, {'name': ['B', 'C', 'G'], 'id': 'B_C_G'}, {'name': ['D', 'E', 'H'], 'id': 'D_E_H'}]
    

             df values: [array([1, 2, 3]), array([4, 5, 6])]
dash expected_data: [{'A_F': 1, 'B_C_G': 2, 'D_E_H': 3}, {'A_F': 4, 'B_C_G': 5, 'D_E_H': 6}]
   calculated data: [{'A_F': 1, 'B_C_G': 2, 'D_E_H': 3}, {'A_F': 4, 'B_C_G': 5, 'D_E_H': 6}]
Run Code Online (Sandbox Code Playgroud)

这是测试的完整代码,包括在破折号中展示结果

我在最后添加了一些实际上在破折号中构建测试表的内容。

############### TESTE 0 ###############
Dataframe:
   A  B  C
0  1  2  3
1  4  5  6
           df cols: ['A', 'B', 'C']
dash expected_cols: [{'name': 'A', 'id': 'A'}, {'name': 'B', 'id': 'B'}, {'name': 'C', 'id': 'D'}]
   calculated cols: [{'name': ['A'], 'id': 'A'}, {'name': ['B'], 'id': 'B'}, {'name': ['C'], 'id': 'C'}]
    

             df values: [array([1, 2, 3]), array([4, 5, 6])]
dash expected_data: [{'A': 1, 'B': 2, 'D': 3}, {'A': 4, 'B': 5, 'D': 6}]
   calculated data: [{'A': 1, 'B': 2, 'C': 3}, {'A': 4, 'B': 5, 'C': 6}]
    
############### TESTE 1 ###############
Dataframe:
      B  D
   A  C  E
0  1  2  3
1  4  5  6
           df cols: [('', 'A'), ('B', 'C'), ('D', 'E')]
dash expected_cols: [{'name': ['', 'A'], 'id': 'A'}, {'name': ['B', 'C'], 'id': 'B_C'}, {'name': ['D', 'E'], 'id': 'D_E'}]
   calculated cols: [{'name': ['', 'A'], 'id': 'A'}, {'name': ['B', 'C'], 'id': 'B_C'}, {'name': ['D', 'E'], 'id': 'D_E'}]
    

             df values: [array([1, 2, 3]), array([4, 5, 6])]
dash expected_data: [{'A': 1, 'B_C': 2, 'D_E': 3}, {'A': 4, 'B_C': 5, 'D_E': 6}]
   calculated data: [{'A': 1, 'B_C': 2, 'D_E': 3}, {'A': 4, 'B_C': 5, 'D_E': 6}]
    
############### TESTE 2 ###############
Dataframe:
      B  D
   A  C  E
   F  G  H
0  1  2  3
1  4  5  6
           df cols: [('', 'A', 'F'), ('B', 'C', 'G'), ('D', 'E', 'H')]
dash expected_cols: [{'name': ['', 'A', 'F'], 'id': 'A_F'}, {'name': ['B', 'C', 'G'], 'id': 'B_C_G'}, {'name': ['D', 'E', 'H'], 'id': 'D_E_H'}]
   calculated cols: [{'name': ['', 'A', 'F'], 'id': 'A_F'}, {'name': ['B', 'C', 'G'], 'id': 'B_C_G'}, {'name': ['D', 'E', 'H'], 'id': 'D_E_H'}]
    

             df values: [array([1, 2, 3]), array([4, 5, 6])]
dash expected_data: [{'A_F': 1, 'B_C_G': 2, 'D_E_H': 3}, {'A_F': 4, 'B_C_G': 5, 'D_E_H': 6}]
   calculated data: [{'A_F': 1, 'B_C_G': 2, 'D_E_H': 3}, {'A_F': 4, 'B_C_G': 5, 'D_E_H': 6}]
Run Code Online (Sandbox Code Playgroud)