【问题标题】:Python Dash: loading pandas dataframes into data tablePython Dash:将熊猫数据帧加载到数据表中
【发布时间】:2019-02-11 00:28:57
【问题描述】:

我最近一直在尝试使用Dash 构建一个应用程序,但是尽管浏览了许多指南,但我根本无法弄清楚如何将 pandas 数据帧导入 Dash 的数据表(这本质上是一个 pandas 数据帧,除了 web -托管和反应)。

大多数示例说明了如何从示例中已经硬编码的数据框中手动选择某些列/行,例如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)

【问题讨论】:

    标签: python pandas plotly-dash


    【解决方案1】:

    someone 也在 plotly 论坛上回复我之后(谢天谢地),似乎最终的答案是预先设置一个数据表,其中包含将在某个时候进入它的 pandas 数据框的列,像这样,

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

    ,然后发送你的 pandas 数据框的字典。

    【讨论】:

    • 那段代码帮了大忙。我不知道为什么,但是只显示同一目录中的文件(不在本地目录中的文件出现“找不到文件”错误)。我认为正在发生的事情是,被拖动/选择的文件被解析为“file_name.csv”(适用于本地目录中的文件)但不是“C:\Users\**\**\*\\文件名.csv”。并且仅当采用完整路径时,“找不到文件”错误才会持续存在。我该如何解决这个问题?
    • 请帮我解决这个问题:stackoverflow.com/questions/58990502/…
    • 我会发表评论,然后你应该告诉我我的评论是否最终对你有用。
    【解决方案2】:

    假设你的 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
    

    【讨论】:

      【解决方案3】:

      这有点远未测试,但基于https://community.plot.ly/t/dash-datatable-using-callbacks/6756,如果您要通过回调修改它们,Dash DataTables 似乎隐含地需要一个初始值。

      尝试更改此行:

      dash_table.DataTable(id='tweet_table')
      

      到这里:

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

      【讨论】:

      • 虽然没用,还是谢谢你回复我;碰巧rows 被弃用作为参数。
      • @Coolio2654,抱歉这不起作用,但我看到你找到了解决方案!
      【解决方案4】:

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

           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(...) 的“列”参数中的任何内容。

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

      【讨论】:

      • 那么,假设所有这些都发生在 Dash 回调中,dash_table.DataTable 会被输出到 html.Div(),还是其他等待它的空对象?
      【解决方案5】:

      正在编写示例代码,这对我有用,这个示例可能对您的查询有所帮助

      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()
      

      【讨论】:

      • 如果数据框是数据透视表,则此代码不起作用
      猜你喜欢
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      相关资源
      最近更新 更多