Изменение значения данных в виде данных dash_table приводит к пустым ячейкам - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь создать графический интерфейс, где пользователь может загрузить CSV-файл без заголовков и загрузить отдельный текстовый файл, который содержит заголовок.Файл CSV будет показан в таблице, и когда текстовый файл будет выбран и загружен, заголовки столбцов таблицы данных будут заменены на заголовки столбцов, содержащиеся в текстовом файле.

Я пробовал дваСпособы сделать это: во-первых, иметь div в app.layout и иметь функцию обратного вызова, возвращающую данные этому div.Используя этот метод, таблица данных загружается корректно, но я не могу понять, как ссылаться и изменять столбцы этой таблицы.

Второй способ - иметь пустую таблицу в app.layout и иметь обратный вызовфункция возвращает данные с помощью панд to_dict ().С помощью этого метода я могу ссылаться на таблицу по ее идентификатору и изменять ее столбцы.Тем не менее, когда я запускаю функцию обратного вызова, результирующая таблица данных остается пустой (хотя число строк кажется правильным).

Это 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 голосов
/ 10 июня 2019

У меня была похожая проблема, и решение для меня было со значениями столбцов name и id. name для каждого столбца - это то, что он будет отображать, и я думаю, это то, что вам нужно изменить после того, как пользователь добавит столбцы. id для каждого столбца должно точно соответствовать имени столбца из df, который вы передаете в data опору таблицы.

Вероятно, у вас несоответствие между этими значениями. Когда это происходит, данные «там», поэтому вы видите правильное количество строк, но таблица не будет отображать их, потому что столбцы неверны. Если у вас есть отдельный обратный вызов для column таблицы, убедитесь, что он отправляет правильные значения.

...