Python Dash:将数据帧加载到数据表中

Python Dash:将数据帧加载到数据表中,python,pandas,plotly-dash,Python,Pandas,Plotly Dash,最近,我一直在尝试用构建一个应用程序,但尽管阅读了许多指南,我还是不知道如何将pandas数据框导入Dash的数据表(本质上是一个pandas数据框,除了网络托管和反应式) 大多数示例说明了如何手动从示例中已硬编码的数据帧中选取某些列/行,如中所示。然而,在我的情况下,数据帧是在我的代码中构建的(熊猫是最容易做到这一点的方法),因此我必须找到一种方法将pd.dataframe()转换为dash\u table.DataTable() 我怎样才能做到这一点?使用这些引用,我尝试使用以下代码将数据帧

最近,我一直在尝试用构建一个应用程序,但尽管阅读了许多指南,我还是不知道如何将pandas数据框导入Dash的数据表(本质上是一个pandas数据框,除了网络托管和反应式)

大多数示例说明了如何手动从示例中已硬编码的数据帧中选取某些列/行,如中所示。然而,在我的情况下,数据帧是在我的代码中构建的(熊猫是最容易做到这一点的方法),因此我必须找到一种方法将
pd.dataframe()
转换为
dash\u table.DataTable()

我怎样才能做到这一点?使用这些引用,我尝试使用以下代码将数据帧的dict发送到
dash\u 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)

这是一个有点长的测试,但基于,似乎Dash数据表隐式地需要一个初始值,如果您要通过回调修改它们

尝试更改此行:

dash_table.DataTable(id='tweet_table')
为此:

dash_table.DataTable(id='tweet_table', rows=[{}])
在plotly论坛上给我回复后(谢天谢地),似乎最终的答案是用pandas dataframe的列预先设置一个人的数据表,这些列将在某个时候进入其中,如下所示

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'}]
)

,然后发送熊猫数据帧的dict。

这里有另一个对我有效的解决方案:

     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'参数传递任何内容时抛出异常


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

假设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
我正在编写示例代码,这对我来说很有效,这个示例可能会帮助您进行查询
虽然它不起作用,但谢谢你仍然回复我;恰好
作为一个参数被弃用了。@Coolio2654,很抱歉这不起作用,但我看到你找到了一个解决方案!因此,假设所有这些都发生在一个Dash回调中,
Dash_table.DataTable
会被输出到一个
html.Div()
,或者其他一些等待它的空对象中吗?这些代码帮了大忙。我不知道为什么,但是,只显示同一目录中的文件(“未找到文件”错误适用于不在本地目录中的文件)。我认为正在发生的是,正在被拖动/选择的文件被解析为“file\u name.csv”(这对本地目录中的文件很有效),而不是“C:\Users\***\***\\file\u name.csv”。而且,只有当采用完整路径时,“未找到文件”错误才会持续。如何修复此问题?请帮助我:我将进行注释,然后您应该告诉我我的注释是否对您有效。如果dataframe是透视表,则此代码不起作用
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()