Gal*_*lat 0 python dataframe pandas plotly-dash
这是通过 Dash 示例创建多标头表的示例:
\nimport 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)\nRun Code Online (Sandbox Code Playgroud)\n\ndata={(\'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\nRun Code Online (Sandbox Code Playgroud)\n\n如何从我的 Pandas 多标头数据帧中制作 Dash 数据表多标头?
\ndef 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)