Dash 应用程序执行期间回调错误的问题

Problem with callback error during Dash app implementation

我正在尝试设置一个简单的 Dash 应用程序,该应用程序 returns 来自用作 "look-up table" 的数据框的值;示例测试的屏幕截图 table 包含在此处

在应用内,用户可以进入许多状态之一(这是上面 table 中的第一列),应用应该 return 来自同一行的相应两列条目该数据框中存在哪个状态。例如:如果用户选择了 LA,应用程序应该 return "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)

你没有提到具体的错误,但我想我能看出问题所在。您的回调正在将 (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 returns 一个值,但您还没有分配它,所以什么也没有发生。使用 df = df.set_index('state') 或在方法调用中包含 inplace=True 标志。

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

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