Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 破折号:创建每个列的下拉列表,而不是每个表的下拉列表_Python_Plotly Dash_Plotly Python - Fatal编程技术网

Python 破折号:创建每个列的下拉列表,而不是每个表的下拉列表

Python 破折号:创建每个列的下拉列表,而不是每个表的下拉列表,python,plotly-dash,plotly-python,Python,Plotly Dash,Plotly Python,我有一个如下所示的数据集: 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 doug

我有一个如下所示的数据集:

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
其目的是,为了在每列(而不是所有列)中生成多选下拉菜单,因为我目前使用的每列过滤器不够,我需要能够一次按每列多个项目进行过滤

使用上面的示例,这将在cat_id下面添加一个名为1,2,3,4的单元格;作者将与昆加、西巴、舍瓦拉和多尔蒂一起下线;年份会有一个下降趋势,如1992199820012011等

我编写了以下代码:

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}),

#Need to move this to being within each column?
        html.Label('Multi-Select Dropdown'),
            dcc.Dropdown(options=[{'label':i,'value':i} for i in df.columns],
            value = [i for i in df.columns],
            multi=True),


        dash_table.DataTable(
         id='adding-rows-table',
         columns=[{"name": i, "id": i,"deletable":True} for i in df.columns],
#        column_conditional_dropdowns=[{'id':i,'dropdowns':df[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)
此方法有两个具体问题:

下拉列表是在表级别完成的,而不是每列级别。 然后,我想过滤该表,以便只显示下拉栏中的内容,这是目前尚未完成的。 我知道代码中存在问题的部分有:

#Need to move this to being within each column?
        html.Label('Multi-Select Dropdown'),
            dcc.Dropdown(options=[{'label':i,'value':i} for i in df.columns],
            value = [i for i in df.columns],
            multi=True),
没有回调,但我是dash的新手,我正在努力理解我应该具体做什么。如果有人能告诉我如何在这段代码中解决这两个问题,我将不胜感激


作为旁注/免责声明,我最初是作为一个更大问题的一部分提出这个问题的,但我意识到我需要使我的问题更具体,更具体,所以我将逐一解决每个问题

谢谢你,卡拉,让这个问题更具体一点。这仍然是一个很好的尺寸咬,所以我会看看我是否可以帮助所有这一切

首先,您需要更改表中的列定义,以便在字典中为每个要显示为下拉列表的列设置“presentation”:“dropdown”。当前下拉列表在表中不起作用,因为您使用了dcc.dropdown组件,它是表中的一个独立组件。如果您想让它们在表中工作,您需要使用列\u static\u下拉列表或列\u conditional\u下拉列表,我看到您已经注释掉了这些下拉列表

不过,我不确定表中的下拉列表是否可以用作回调的一部分。我试图连接一个,但下拉列表的ID没有被识别为布局的一部分。我认为,要实现您想要的功能,需要使用dcc.Dropdown设置多个下拉列表,并将这些值作为输入连接到更新表的数据属性的回调

下面是一个我已经确认有效的小例子,但有一些局限性:

app=dash.dash\u名称__ df=pd.DataFramenp.arange30.5,6 app.layout=html.Div[ html.Div[ dcc.输入 id='adding-rows-name', 占位符=“输入列名…”, 值=, 样式={'padding':10}, html.Button'addcolumn',id='adding-rows-Button',n_clicks=0],style={'height':50}, 需要将其移动到每个列中吗? html.Label'Multi-Select Dropdown', dcc.下拉列表 id='test-dropdown', 选项=[{'label':i,'value':i}用于df[0]]中的i, 值=[i代表df[0]]中的i, 多重=真, dash_table.DataTable id='adding-rows-table', columns=[{name:i,id:i,deletable:True}用于df.columns中的i], 数据=df.to_dict'rows', 可编辑=真, 过滤=真, 排序=真, 排序类型=多个, 行_可选=多行, 行_deletable=True, 选定的_行=[], 分页模式=fe, 样式\单元\条件=[ { 'if':{'row_index':'odd'}, “背景颜色”:“rgb230、255、230” } ] + [ { 'if':{'column_id':c}, “文本对齐”:“左” }对于[‘日期’、‘地区’中的c ], 样式标题={ “背景颜色”:“白色”, “fontWeight”:“bold” } , html.Button'addrow',id='editing-rows-Button',n_clicks=0, dcc.Graphid='adding-rows-graph', ] @app.callback 输出'adding-rows-table','data', [输入'editing-rows-button','n_clicks', 输入'test-dropdown','value'], [说明'adding-rows-table','data', 状态“添加行-表”、“列”] def添加行单击、下拉值、行、列: 如果n_单击>0: 附加{c['id']:对于列中的c} df=pd.DataFrame.from\u 尝试: df_filtered=df[df['0']。isindropdown_值] 除类型错误外: df_filtered=df[df['0'].eqdropdown_值] 返回df_filtered.to_dictorient='records' 现在只有一个下拉列表,它适用于第一列中的值。您需要添加更多内容,而且很快就会变得复杂。您可能可以设置下拉列表的样式,以便它们与相关列更清晰地关联

还有一个问题是,一旦过滤掉行,该如何处理它们。回调从表中提取状态数据,但是,如果一行被过滤掉,那么它就不在状态中,并且无法恢复 不能通过再次在下拉列表中进行选择来重新添加。您需要一种不同的方式来处理存储表的数据,以便不会以这种方式擦除行