【问题标题】:Problem with callback error during Dash app implementationDash 应用程序实施期间的回调错误问题
【发布时间】:2019-06-13 22:39:40
【问题描述】:

我正在尝试设置一个简单的 Dash 应用程序,该应用程序从用作“查找表”的数据框中返回一个值;此处包含示例测试表的屏幕截图

在应用程序中,用户可以输入多个状态之一(这是上表中的第一列),应用程序应从该数据帧中存在状态的同一行返回相应的两列条目。例如:如果用户选择了 LA,则应用应返回“med”和“radio”

很遗憾,在用户选择后,我收到了一个回调错误。我的代码附在下面。有人可以指导我解决这个问题吗?这是我第一次使用 Dash - 非常感谢任何指导!

app = dash.Dash(__name__)
server = app.server

df=pd.read_csv("test_lookup_table.csv", delimiter=',', encoding="utf-8-sig")
df.set_index('state')

app.layout = html.Div([
    html.H1('On demand look up '),
    html.H3('Select from list of states below'),
    dcc.Dropdown(
        id='dropdown',
        options=[{'label': i, 'value': i} for i in df.state],
        value='LALA'
    ),
    html.Div(id='display-value')
])


@app.callback(
    Output('dropdown','options'),
    [Input('dropdown', 'value')])


def callback_a(i):
    return df.loc[i, 1:3]

if __name__ == '__main__':
    app.run_server(debug=True)

【问题讨论】:

    标签: python pandas plotly-dash


    【解决方案1】:

    你没有提到具体的错误,但我想我可以看到问题。您的回调正在输出 (Output) 到下拉组件的 options 属性。听起来您想输出到其他东西,例如 divp 组件。你有一个display-value ID 对应一个div,所以也许这就是你想要它去的地方?尝试像这样更改您的回调:

    @app.callback(
        Output('display-value', 'children'),
        [Input('dropdown', 'value')])
    def callback_a(i):
        return df.loc[i, 1:3]
    

    编辑:

    一个问题来自于将索引设置为使用state 列值。 set_index 返回一个值,但你还没有分配它,所以什么都没有发生。使用df = df.set_index('state') 或在方法调用中包含inplace=True 标志。

    这导致了关键错误,因为df 没有将状态值作为索引,因此您无法查找它们。现在您可以在回调中使用df.loc[i],它将能够找到正确的行。但是,您不能在此处使用[1:3],因为loc 按名称引用,而不是行/列的值,并且您没有以整数命名的列。你可以做df.loc[i].tolist()[1:3]。但是,以state 作为索引,每行只有两个值(索引0 和1),所以:3] 部分永远不会得到任何东西。您只会得到索引 1 处的内容。

    最后,我应该在之前提到这一点,您已将 df 设置为全局变量,这通常不是最佳实践。最好使用回调从 CSV 文件中加载 df 并将其添加到某个组件中,例如 dash_table.DataTable。然后,您可以让其他回调从该表中提取值,而不是引用全局变量。

    【讨论】:

    • 谢谢@coralvanda。上面的修复帮助解决了我得到的“keyerror”——但现在得到了一个“dash.exceptions.nolayoutexception”。我试图通过将我的返回输出转换为 dash_table.DataTable 来解决这个问题,但没有成功 - 仍然有同样的错误。如何从 return 语句中获取所需的行以及列标题?
    • 我用 dcc.Dropdown = 'LA' 中的值重新运行了上面的代码(而不是如上所示的 LALA),但它产生了两个错误 - a) 下拉菜单中的 options[3].label ID“下拉”是必需的,但未提供,并且 b) 更新 display-value.children 的回调错误。有什么想法我在这里做错了吗?
    • 用更多细节更新了我的原始答案。我希望这对你有用!
    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2022-06-23
    • 2020-08-11
    • 2013-06-23
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多