Python Dash:将pandas数据框加载到数据表中

时间:2019-02-11 00:28:57

标签: python pandas plotly-dash

我最近一直在尝试使用Dash构建应用程序,但是尽管查看了许多指南,但我仍然无法弄清楚如何将熊猫数据框导入Dash的数据表(本质上是熊猫数据框) ,除了反应性)。

大多数示例说明了如何从示例中已进行硬编码的数据帧中手动选取某些列/行,例如here。但是,在我的情况下,数据帧是在我的代码中构建的(而熊猫是这样做的最简单方法),因此我最终不得不找出一种将pd.Dataframe()转换为dash_table.DataTable()的方法。

我该如何进行这项工作?使用这些引用,我尝试了以下代码将我的数据帧的字典发送到dash_table.DataTable(),但没有任何显示。

我的代码:

## Imports
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_table

from dash.dependencies import Input, Output, State

import datetime as dt
import pandas as pd
import numpy as np

## Custom functions that creates the pandas dataframe
from twitter_functions import old_tweets

app = dash.Dash(dev_tools_hot_reload=True)
app.scripts.config.serve_locally = True
app.config['suppress_callback_exceptions'] = True


app.layout = html.Div(children=[

    html.H3('Twitter App'),

    dcc.Input('ScreenName_Input', type='text'),

    html.Button(id='screenNames_submit_button', children='Submit'),

    dash_table.DataTable(id='tweet_table')

])

@app.callback(
    Output(component_id='tweet_table', component_property='data'),
    [Input(component_id='screenNames_submit_button', component_property='n_clicks_timestamp')],
    [State(component_id='ScreenName_Input', component_property='value')]
)
def display_tweets(submit_button, screen_names):
    tweets = old_tweets(screen_names)

    return tweets.to_dict(orient='records')

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

5 个答案:

答案 0 :(得分:5)

假设您的tweets函数返回一个数据帧, 将表列添加为回调的第二个输出应该可以。

@app.callback(
    [Output(component_id='tweet_table', component_property='data'),
     Output(component_id='tweet_table', component_property='columns')
    [Input(component_id='screenNames_submit_button', component_property='n_clicks_timestamp')],
    [State(component_id='ScreenName_Input', component_property='value')]
)
def display_tweets(submit_button, screen_names):
    tweets = old_tweets(screen_names)
    columns = [{'name': col, 'id': col} for col in tweets.columns]
    data = tweets.to_dict(orient='records')
    return data, columns

答案 1 :(得分:3)

someone在密谋论坛上也回答了我(非常感谢),看来最后的答案是用一个熊猫数据框的列预先设置一个人的数据表像这样

dash_table.DataTable(
    id='table',
    columns=[
    {'name': 'Column 1', 'id': 'column1'},
    {'name': 'Column 2', 'id': 'column2'},
    {'name': 'Column 3', 'id': 'column3'},
    {'name': 'Column 4', 'id': 'column4'},
    {'name': 'Column 5', 'id': 'column5'}]
)

,然后发送您的熊猫数据框的字典。

答案 2 :(得分:1)

这是一个漫长的过程,未经测试,但是基于https://community.plot.ly/t/dash-datatable-using-callbacks/6756,如果您打算通过回调修改Dash DataTable,则Dash DataTables隐式需要一个初始值。

尝试更改此行:

dash_table.DataTable(id='tweet_table')

对此:

dash_table.DataTable(id='tweet_table', rows=[{}])

答案 3 :(得分:0)

这是另一个对我有用的解决方案:

     dt_col_param = []

     for col in output_df.columns:
            dt_col_param.append({"name": str(col), "id": str(col)})

    dash_table.DataTable(
            columns=dt_col_param,
            data=output_df.to_dict('records')
        )

我最大的问题是我的应用程序不断对我尝试传递给dash_table.DataTable(...)的'columns'参数的内容抛出异常。

希望这将有助于不必对任何内容进行硬编码。

答案 4 :(得分:0)

正在处理示例代码,这对我有用,这个示例可能会帮助您进行查询

import pandas as pd
import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html
import dash_table
import base64
import io

app = dash.Dash()

# app.scripts.config.serve_locally = True
# app.css.config.serve_locally = True

DF_GAPMINDER = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv'
)
DF_GAPMINDER = DF_GAPMINDER[DF_GAPMINDER['year'] == 2007]
DF_GAPMINDER.loc[0:20]

DF_SIMPLE = pd.DataFrame({
    'x': ['A', 'B', 'C', 'D', 'E', 'F'],
    'y': [4, 3, 1, 2, 3, 6],
    'z': ['a', 'b', 'c', 'a', 'b', 'c']
})


dataframes = {'DF_GAPMINDER': DF_GAPMINDER,
              'DF_SIMPLE': DF_SIMPLE}


def get_data_object(user_selection):
    """
    For user selections, return the relevant in-memory data frame.
    """
    return dataframes[user_selection]


app.layout = html.Div([
    html.H4('DataTable'),
    html.Label('Report type:', style={'font-weight': 'bold'}),
    dcc.Dropdown(
        id='field-dropdown',
        options=[{'label': df, 'value': df} for df in dataframes],
        value='DF_GAPMINDER',
        clearable=False
    ),
    
    dash_table.DataTable(id='table')
])


@app.callback([Output(component_id='table', component_property='data'), 
             Output(component_id='table', component_property='columns')],
            [Input('field-dropdown', 'value')])
def update_table(user_selection):
    """
    For user selections, return the relevant table
    """
    
    df = get_data_object(user_selection)
    columns = [{'name': col, 'id': col} for col in df.columns]
    data = df.to_dict(orient='records')
    return data, columns


app.run_server()