1つのDashDataTableから2番目のDashDataTableに入力をフィードします

Aug 19 2020

Dashの初心者として簡単な質問があります。私はテーブルを使用してユーザー入力を受け入れ、それを読み込み、最終的にアクションを実行してから、最初のテーブルの下に結果テーブルを返します。以下は私のコードです:

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import dash_table
import os
from dash.dependencies import Input, Output
import numpy as np

names = ['Player','Pos','Games','Rush Mkt Shr','Yds/Rush','Rush TD Rate','Tgt Mkt Shr','Yds/Rec','Rec TD Rate','Catch Rate','Int Rate','QB Snaps']
team_entries = pd.DataFrame(np.zeros((11,len(names))),columns = names)
team_entries['Pos']=['QB','RB','RB','RB','WR','WR','WR','WR','TE','TE','TEAM']
team_entries['Games'] = 16

app.layout = html.Div([
    html.Div(id='div1', children=[dash_table.DataTable(
        id='table-editing-simple',
        columns=([{'id': p, 'name': p} for p in team_entries.columns]),
        data=team_entries.to_dict('records'),
        editable=True
    )]),
    html.Div(id = 'div2', children=[dash_table.DataTable(id='table-editing-simple-output')])
])


@app.callback(
    Output('table-editing-simple-output', 'data'),
    [Input('table-editing-simple', 'data'),
     Input('table-editing-simple', 'columns')])
def display_output(rows, columns):
    df = pd.DataFrame(rows, columns=[c['name'] for c in columns])
    df['Games'] = df['Games']*2
    return df.to_dict('records')


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

残念ながら、IDが 'table-editing-simple-output'の2番目のテーブルは出力されず、なぜそうなるのかよくわかりません。次に、出力テーブルに異なる列名を付けたい場合、どうすればよいですか?

回答

1 JensD Aug 19 2020 at 18:45

これを試してみてください。コールバック関数で、データを返す代わりに、出力をOutput('div2', 'children')次のように置き換えて、まったく新しいダッシュデータテーブルを返してみてください。

@app.callback(
    Output('div2', 'children'),
    [Input('table-editing-simple', 'data'),
     Input('table-editing-simple', 'columns')])
def display_output(rows, columns):
    df = pd.DataFrame(rows, columns=[c['name'] for c in columns])
    df['Games'] = df['Games']*2
    return dash_table.DataTable(
        id='table-output',
        columns=columns,
        data=rows,
    )

このように、列名も自由に変更できます!作業コードは次のとおりです。

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import dash_table
import os
from dash.dependencies import Input, Output
import numpy as np

names = ['Player','Pos','Games','Rush Mkt Shr','Yds/Rush','Rush TD Rate','Tgt Mkt Shr','Yds/Rec','Rec TD Rate','Catch Rate','Int Rate','QB Snaps']
team_entries = pd.DataFrame(np.zeros((11,len(names))),columns = names)
team_entries['Pos']=['QB','RB','RB','RB','WR','WR','WR','WR','TE','TE','TEAM']
team_entries['Games'] = 16
app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div(id='div1', children=[dash_table.DataTable(
        id='table-editing-simple',
        columns=([{'id': p, 'name': p} for p in team_entries.columns]),
        data=team_entries.to_dict('records'),
        editable=True
    )]),
    html.Div(id = 'div2', children=[dash_table.DataTable(id='table-editing-simple-output')])
])


@app.callback(
    Output('div2', 'children'),
    [Input('table-editing-simple', 'data'),
     Input('table-editing-simple', 'columns')])
def display_output(rows, columns):
    df = pd.DataFrame(rows, columns=[c['name'] for c in columns])
    df['Games'] = df['Games']*2
    return dash_table.DataTable(
        id='table-output',
        columns=columns,
        data=rows,
    )


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