我试图建立一个简单的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)
答案 0 :(得分:1)
您没有提到具体错误,但我认为我可以看到问题。您的回调正在将(Output
)输出到下拉组件的options
属性。听起来您想输出到其他内容,例如div
或p
组件。您有一个display-value
的{{1}} 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]
作为索引,每行只有两个值(索引0和1),因此state
部分永远不会得到任何东西。您将得到索引1的内容。
最后,我之前应该提到这一点,您已经将:3]
设置为全局变量,这通常不是最佳实践。最好使用回调从您的CSV文件中加载df
并将其添加到某个组件中,例如df
。然后,您可以让其他回调从该表中提取值,而不用引用全局变量。