[英]Return a Pandas DataFrame as a data_table from a callback with Plotly Dash for Python
我想讀取一個.csv文件,並返回一個groupby函數作為回調,以使用“ dash_table”庫顯示為簡單數據表。 @Lawliet的有用答案顯示了如何使用“ dash_table_experiments”庫執行此操作。 這是我遇到的問題:
import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_table
from dash.dependencies import Input, Output, State
df = pd.read_csv(
'https://gist.githubusercontent.com/chriddyp/'
'c78bf172206ce24f77d6363a2d754b59/raw/'
'c353e8ef842413cae56ae3920b8fd78468aa4cb2/'
'usa-agricultural-exports-2011.csv')
app = dash.Dash()
application = app.server
app.layout = html.Div([
dash_table.DataTable(
id = 'datatable',
),
html.Div([
html.Button(id='submit-button',
children='Submit'
)
]),
])
@app.callback(Output('datatable','data'),
[Input('submit-button','n_clicks')],
[State('submit-button','n_clicks')])
def update_datatable(n_clicks,csv_file):
if n_clicks:
dfgb = df.groupby(['state']).sum()
return dfgb.to_dict('rows')
if __name__ == '__main__':
application.run(debug=False, port=8080)
當您嘗試將回調Output
組件注冊為DataTable
,應在回調中更新並返回DataTable
組件的所有必需/必需屬性。 在您的代碼中,您只更新DataTable.data
而不更新DataTable.column
,一種簡單的方法是返回預填充了所有必需屬性值的整個Datatable
組件。
這是一個例子
import dash_html_components as html
import dash_core_components as dcc
import dash
import dash_table
import pandas as pd
import dash_table_experiments as dt
app = dash.Dash(__name__)
#data to be loaded
data = [['Alex',10],['Bob',12],['Clarke',13],['Alex',100]]
df = pd.DataFrame(data,columns=['Name','Mark'])
app.layout = html.Div([
dt.DataTable(
rows=df.to_dict('records'),
columns=df.columns,
row_selectable=True,
filterable=True,
sortable=True,
selected_row_indices=list(df.index), # all rows selected by default
id='2'
),
html.Button('Submit', id='button'),
html.Div(id="div-1"),
])
@app.callback(
dash.dependencies.Output('div-1', 'children'),
[dash.dependencies.Input('button', 'n_clicks')])
def update_output(n_clicks):
df_chart = df.groupby('Name').sum()
return [
dt.DataTable(
rows=df_chart.to_dict('rows'),
columns=df_chart.columns,
row_selectable=True,
filterable=True,
sortable=True,
selected_row_indices=list(df_chart.index), # all rows selected by default
id='3'
)
]
if __name__ == '__main__':
app.run_server(debug=True)
似乎已棄用dash-table-experiments
。
編輯1:這是使用dash_tables
一種方法
import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_table as dt
from dash.dependencies import Input, Output, State
df = pd.read_csv(
'https://gist.githubusercontent.com/chriddyp/'
'c78bf172206ce24f77d6363a2d754b59/raw/'
'c353e8ef842413cae56ae3920b8fd78468aa4cb2/'
'usa-agricultural-exports-2011.csv')
app = dash.Dash()
application = app.server
app.layout = html.Div([
dt.DataTable(
id = 'dt1',
columns = [{"name": i, "id": i,} for i in (df.columns)],
),
html.Div([
html.Button(id='submit-button',
children='Submit'
)
]),
])
@app.callback(Output('dt1','data'),
[Input('submit-button','n_clicks')],
[State('submit-button','n_clicks')])
def update_datatable(n_clicks,csv_file):
if n_clicks:
dfgb = df.groupby(['state']).sum()
data_1 = df.to_dict('rows')
return data_1
if __name__ == '__main__':
application.run(debug=False, port=8080)
另一種方式:返回整個DataTable
import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_table as dt
from dash.dependencies import Input, Output, State
df = pd.read_csv(
'https://gist.githubusercontent.com/chriddyp/'
'c78bf172206ce24f77d6363a2d754b59/raw/'
'c353e8ef842413cae56ae3920b8fd78468aa4cb2/'
'usa-agricultural-exports-2011.csv')
app = dash.Dash()
application = app.server
app.layout = html.Div([
html.Div(id="table1"),
html.Div([
html.Button(id='submit-button',
children='Submit'
)
]),
])
@app.callback(Output('table1','children'),
[Input('submit-button','n_clicks')],
[State('submit-button','n_clicks')])
def update_datatable(n_clicks,csv_file):
if n_clicks:
dfgb = df.groupby(['state']).sum()
data = df.to_dict('rows')
columns = [{"name": i, "id": i,} for i in (df.columns)]
return dt.DataTable(data=data, columns=columns)
if __name__ == '__main__':
application.run(debug=False, port=8080)
我提到了這個例子: https : //github.com/plotly/dash-table/blob/master/tests/cypress/dash/v_copy_paste.py#L33
您只需在update_datatable
進行少量修改就可以完成它,它應該可以正常工作(未經測試):
def update_datatable(n_clicks,csv_file):
if n_clicks:
dfgb = df.groupby(['state']).sum()
return html.Div([dash_table.DataTable(
data=dfgb.to_dict('rows'),
columns=[{'name': i, 'id': i} for i in dfgb.columns],
style_header={'backgroundColor': "#FFD700",
'fontWeight': 'bold',
'textAlign': 'center',},
style_table={'overflowX': 'scroll'},
style_cell={'minWidth': '180px', 'width': '180px',
'maxWidth': '180px','whiteSpace': 'normal'},
filtering=True,
row_selectable="multi",
n_fixed_rows=1),
html.Hr()
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.