我正在尝试创建一个绘图界面,用户可以在其中上传不带标题的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行的空单元格),这让我认为至少是通过回调发送了一些东西。
会有人知道如何解决我提到的两种方法,或者知道一种更好的方法来完成此任务吗?
答案 0 :(得分:0)
我遇到了类似的问题,对我来说,解决方法是使用列name
和id
的值。每列的name
是它将显示的内容,我认为这是用户添加列后您需要更改的内容。每列的id
必须与您传递给表的df
属性的data
中的列名完全匹配。
很可能,这些值之间不匹配。发生这种情况时,数据为“那里”,这就是为什么您看到适当的行数的原因,但是表不会显示它,因为列是错误的。如果表的column
属性具有单独的回调,请确保该函数发送正确的值。