更改绘图dash_table datatable数据值将导致空白单元格

时间:2019-06-09 20:06:30

标签: python-3.x plotly-dash

我正在尝试创建一个绘图界面,用户可以在其中上传不带标题的csv文件,并上传包含标题的单独文本文件。 csv文件将显示在表格中,并且当选择并加载文本文件时,数据表的列标题将替换为文本文件中包含的列标题。

我尝试了两种方法来做到这一点: 首先是在app.layout中有一个div,并有一个回调函数将数据表返回到该div。使用这种方法,数据表可以正确加载,但是我无法弄清楚如何引用和更改该表的列。

第二种方法是在app.layout中有一个空白表,并让一个回调函数使用pandas to_dict()返回数据。通过这种方法,我可以按其ID引用该表并更改其列。但是,当我运行回调函数时,结果数据表为空(尽管行数似乎正确)。

这是app.layout

app.layout = html.Div([
    html.H1('Upload File'),

    dcc.Upload(
        id ='upload_data',
        children = html.Button('Select Data File', 
                id = 'load_data_button')
    ),

    html.H2('Upload Headers'),

    dcc.Upload(
        id ='upload_headers',
        children = html.Button('Select Headers File', 
                id = 'load_header_button')
    ),
    html.Div(id = 'my_headers'),
    html.Div(id = 'my_data'),

    html.Div(
        dash_table.DataTable(
            id = 'load_data_table'
        )
    )
])

这是有问题的回调

@app.callback(
    Output('load_data_table', 'data'),
    [Input('upload_data', 'contents')]
)
def update_table(content):
    if content is not None:
        content_type, content_string = content.split(',')
        decoded = base64.b64decode(content_string)
        df = pd.read_csv(io.BytesIO(decoded), header = None)

        return df.to_dict('records')

    else:
        return [{}] 

这是我提到的第二种方法的代码。如图所示,未设置初始表数据,并且将输出映射到表的数据。

我希望数据会出现在表中,但实际上发生的是表单元格为空。但是,行数是正确的(即如果我的csv是5行,它将生成5行的空单元格),这让我认为至少是通过回调发送了一些东西。

会有人知道如何解决我提到的两种方法,或者知道一种更好的方法来完成此任务吗?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,对我来说,解决方法是使用列nameid的值。每列的name是它将显示的内容,我认为这是用户添加列后您需要更改的内容。每列的id必须与您传递给表的df属性的data中的列名完全匹配。

很可能,这些值之间不匹配。发生这种情况时,数据为“那里”,这就是为什么您看到适当的行数的原因,但是表不会显示它,因为列是错误的。如果表的column属性具有单独的回调,请确保该函数发送正确的值。