使用Dash/Python中的下拉框筛选数据表
我正在使用Python和Dash创建一个交互式web应用程序。我已经创建了一个简单的表格来显示所有球员和一般统计数据,但是我想用一个下拉列表来过滤表格,这样就可以只选择某个球队的球员 下拉函数正在工作,但我真的很难处理数据表和回调。我知道您可以在标题中进行筛选(我找到的所有教程都演示了这一点),但我确实希望它使用回调方法更新表,这将有助于我接下来需要做的事情 如果需要,这里有一个指向我的excel数据的链接 我目前的代码是:使用Dash/Python中的下拉框筛选数据表,python,plotly,plotly-dash,Python,Plotly,Plotly Dash,我正在使用Python和Dash创建一个交互式web应用程序。我已经创建了一个简单的表格来显示所有球员和一般统计数据,但是我想用一个下拉列表来过滤表格,这样就可以只选择某个球队的球员 下拉函数正在工作,但我真的很难处理数据表和回调。我知道您可以在标题中进行筛选(我找到的所有教程都演示了这一点),但我确实希望它使用回调方法更新表,这将有助于我接下来需要做的事情 如果需要,这里有一个指向我的excel数据的链接 我目前的代码是: import openpyxl from openpyxl
import openpyxl
from openpyxl import load_workbook
import os
import pathlib
import dash
from dash.dependencies import Input, Output
import dash_table
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
navy = '#06122F'
blue = '#0074D9'
gb_blue = '#004373'
red = '#C51E42'
light_grey = '#F6F6F6'
#=-----------------------
df = pd.read_excel('Box Data.xlsx', sheet_name='Player Stats')
app = dash.Dash(__name__)
#--------------------------------
#group by team and then take an average of the advanced stats
df = df.groupby(['Player', 'Team'])[['#', 'MIN', 'PTS', 'FGM', 'FGA', 'FG%']].mean()
df.reset_index(inplace=True)
app.layout = html.Div([
html.Label('Select Team'),
dcc.Dropdown(
id='select_team',
options=[{'label': i, 'value': i} for i in df['Team'].unique()],
value=[i for i in df['Team']],
searchable=True,
style={'width':'75%'}
),
dash_table.DataTable(
id='general_stats',
columns=[{"name": i, "id": i} for i in df.columns],
data=df.to_dict('records'),
style_header={
'backgroundColor': blue,
'fontWeight': 'bold',
'color': 'white',
'border': '0px'
},
style_cell={'padding': '5px', 'border': '0px', 'textAlign': 'center'},
style_data_conditional=[
{
'if': {'row_index': 'odd'},
'backgroundColor': light_grey,
'if':{
'filter_query': '{Team}= "TEAM SOLENT KESTRELS"' #filter to display our team
},
'backgroundColor': red,
'color': 'white'
}
],
style_cell_conditional=[
{
'if': {'column_id': c},
'textAlign': 'left'
} for c in ['Player', 'Team']
],
style_as_list_view=True,
page_action='native',
fixed_rows={'headers':True},
style_table={'height': '400px', 'overflowY': 'auto'},
sort_action='native',
)
])
@app.callback(
[Output('general_stats', 'data')],
[Input(component_id='select_team', component_property='value')]
)
def update_table(option_selected):
filtered_df = df[df.Team != option_selected]
return(filtered_df)
if __name__ == '__main__':
app.run_server(debug=True)
提前感谢您的帮助确切的问题是什么?我看到您正在将df返回到datatable的数据字段。但是在html中,您的usinf df.to_dict()。另外,您正在按团队筛选df!=如果我诚实的话,我在回叫中跌跌撞撞地通过了def,根据我的研究,我只走了那么远,但可能是完全错误的。我基本上希望根据下拉列表中选择的团队筛选表(因此将代码更改为==而不是!=)。我收到一条错误消息,上面写着dash.exceptions.invalidcallbackreturnvalue。。。。。。是一个多输出。将输出类型排除为列表或元组,但得到了。。。。。。。(它显示了df)哦,这是因为在回调装饰器中,您将输出放在一个列表中。要么删除该列表,要么返回[filtereddf..to_dict(records)]惊人的效果!谢谢你的帮助,比我想象的更接近正确的代码。对于遇到此问题的任何人,最后的代码是
def update\u table(option\u selected):filtered\u df=df[df.Team==option\u selected]return[filtered\u df.to\u dict('records')]
确切的问题是什么?我看到您正在将df返回到datatable的数据字段。但是在html中,您的usinf df.to_dict()。另外,您正在按团队筛选df!=如果我诚实的话,我在回叫中跌跌撞撞地通过了def,根据我的研究,我只走了那么远,但可能是完全错误的。我基本上希望根据下拉列表中选择的团队筛选表(因此将代码更改为==而不是!=)。我收到一条错误消息,上面写着dash.exceptions.invalidcallbackreturnvalue。。。。。。是一个多输出。将输出类型排除为列表或元组,但得到了。。。。。。。(它显示了df)哦,这是因为在回调装饰器中,您将输出放在一个列表中。要么删除该列表,要么返回[filtereddf..to_dict(records)]惊人的效果!谢谢你的帮助,比我想象的更接近正确的代码。对于遇到此问题的任何人,最后的代码是def update\u table(option\u selected):filtered\u df=df[df.Team==option\u selected]return[filtered\u df.to\u dict('records')]