我有一个看起来像这样的数据集:
cat_id author year publisher country value (dollars)
name1 kunga 1998 D and D Australia 10
name2 siba 2001 D and D UK 20
name3 siba 2001 D and D US 20
name3 shevara 2001 D and D UK 10
name3 dougherty 1992 D and D Australia 20
name4 ken 2011 S and K Australia 10
我想把它变成一张桌子。我拥有要设置的大部分代码:
#!/usr/bin/env python
import dash
from dash.dependencies import Input, Output, State
import dash_table
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
app = dash.Dash(__name__)
df = pd.read_excel('dash_test_doc.xlsx')
app.layout = html.Div([
html.Div([
dcc.Input(
id='adding-rows-name',
placeholder='Enter a column name...',
value='',
style={'padding': 10},
),
html.Button('Add Column', id='adding-rows-button', n_clicks=0)
], style={'height': 50}),
dash_table.DataTable(
id='adding-rows-table',
columns=[{"name": i, "id": i} for i in df.columns],
data = df.to_dict('rows'),
editable=True,
filtering=True,
sorting=True,
sorting_type="multi",
row_selectable="multi",
row_deletable=True,
selected_rows=[],
pagination_mode="fe",
style_cell_conditional=[
{
'if': {'row_index': 'odd'},
'backgroundColor': 'rgb(230, 255, 230)'
}
] + [
{
'if': {'column_id': c},
'textAlign': 'left'
} for c in ['Date', 'Region']
],
style_header={
'backgroundColor': 'white',
'fontWeight': 'bold'
}
),
html.Button('Add Row', id='editing-rows-button', n_clicks=0),
dcc.Graph(id='adding-rows-graph'),
])
@app.callback(
Output('adding-rows-table', 'data'),
[Input('editing-rows-button', 'n_clicks')],
[State('adding-rows-table', 'data'),
State('adding-rows-table', 'columns')])
def add_row(n_clicks, rows, columns):
if n_clicks > 0:
rows.append({c['id']: '' for c in columns})
return rows
@app.callback(
Output('adding-rows-table', 'columns'),
[Input('adding-rows-button', 'n_clicks')],
[State('adding-rows-name', 'value'),
State('adding-rows-table', 'columns')])
def update_columns(n_clicks, value, existing_columns):
if n_clicks > 0:
existing_columns.append({
'id': value, 'name': value,
'editable_name': True, 'deletable': True
})
return existing_columns
@app.callback(
Output('adding-rows-graph', 'figure'),
[Input('adding-rows-table', 'data'),
Input('adding-rows-table', 'columns')])
def display_output(rows, columns):
return {
'data': [{
'type': 'heatmap',
'z': [[row.get(c['id'], None) for c in columns] for row in rows],
'x': [c['name'] for c in columns]
}]
}
if __name__ == '__main__':
app.run_server(debug=True)
如果有人能帮助我,我将竭尽全力,我很感激:
我想为每列创建一个下拉菜单,而无需预先定义下拉选项并允许多项选择。例如,使用此处的表,在发布者中,有两个选择(D和D,以及S和K);我希望这些内容自动显示为下拉选项,以进行过滤,而无需对其进行硬编码,因为例如,如果我编辑输入表并添加一行,并且添加了另一个发布者(例如A和D),我希望A和D自动添加到下拉选项? (所以最终的想法是模仿excel,在这里我可以从下拉菜单中进行选择,例如从该列的下拉菜单中选择D和D以及S和K,然后基于此过滤条目。)
< / li>是否可以选择多个行并通过一项操作将其删除?在这一刻,我可以删除单行。
是否可以导出表格?例如说我读了一个表,然后有人删除了一些列/行,我可以导出结果表吗?
如果有人可以帮助我找出这些代码,我将不胜感激。附带说明一下,由于我才刚刚起步,如果有人对这个脚本有任何其他改进建议,我将不胜感激。
答案 0 :(得分:1)
您可能想在这里做的是为每个下拉列表创建一个回调(或所有下拉列表的多输出回调),该回调输出到options
道具。可能是由于表更新触发的。您可以使用虚拟下拉菜单选项来初始化布局中的下拉菜单,然后让回调函数从那里开始。
我不确定该表是否单独执行此操作,但是您可以使该表的回调做到这一点。因为每个唯一输出只能有一个回调,所以任何涉及更新表的data
属性的操作都必须在接缝回调下运行。您可能会添加一个类似“删除行”的按钮,以Input
的形式进行监听,并将数据和选定的行用作State
。单击该按钮并触发回调时,您只需为表重建数据框,而在rows_selected
值中不包含行,然后再次输出到表的数据。
好的。怎么导出?您可以通过按钮“导出数据”设置回调,该回调可以根据需要导出。您可以使用该函数将数据转储到文件中,或将其打印到控制台,将其保存在数据库中,通过电子邮件发送,或者基本上您想要的任何东西。您实际上可以使用Python进行的任何操作。回调将需要输出,因此也许只需打开对话框或小吃店,让用户知道已接收到导出请求并已开始/完成了导出请求。