Как преобразовать html_Table в фрейм данных pandas в Dash с помощью python?

#python-3.x #plotly-dash

#python-3.x #plotly-dash

Вопрос:

У меня есть фрейм данных pandas в Dash, который преобразуется в HTML перед возвратом в html.Div () с помощью функции ниже —

 def generate_table(dataframe, max_rows=10):
    return html.Table(
        # Header
        [html.Tr([html.Th(col) for col in dataframe.columns])]  

        # Body
        [html.Tr([
            html.Td(dataframe.iloc[i][col]) for col in dataframe.columns
        ]) for i in range(min(len(dataframe), max_rows))]
    )
  

Это снова будет вводом при обратном вызове, где мне нужно преобразовать таблицу html в фрейм данных, чтобы я мог выполнять вычисления по ее столбцам. Я пробовал это — [не помогло, хотя]

 @app.callback(
    [Output("newtable", "children")],
    [Input("mastertable", "children"),
     ])
def performcalc(x):
    if not x is None:
        tb = pd.read_html(str([x])) # this is not working
        ## Perfomr calculations on dataframe ##
        return [tb]
    return None

  

Как я могу преобразовать ввод html в фрейм данных pandas?

Кроме того, последняя строка таблицы будет сводной строкой, то есть суммой соответствующих столбцов. Я хотел бы передать строку, отделяющую значения от сводной строки, когда я возвращаю ее в Div. Что-то вроде этого —

 Col1  Col2  Col3
 1     2     3
 3     2     1
----------------
 4     4     4
  

Заранее благодарю вас за помощь.

Комментарии:

1. Обязательно ли использовать таблицу html? Не могли бы вы вместо этого использовать таблицу данных Dash ? Это значительно упростило бы этот процесс.

2. Я не пробовал datatable. Так может ли отображаемый datatable быть преобразован обратно в фрейм данных? или можно выполнять операции с самой таблицей данных? Можете ли вы предоставить пример кода?

Ответ №1:

Спасибо @coralvanda за ваше предложение. Использование таблиц Dash решило проблему.

 import pandas as pd
import dash_table as dt

## Render dataframe as datatable
# Where, DF = pd.DataFrame object
dt.DataTable(
    columns=[{"name": i, "id": i} for i in DF.columns],
    data=DF.to_dict('records')
)
## Convert datatable from an Input in callback function to dataframe.
# Where x is callback input

finalDF = pd.DataFrame(x['props']['data'])