How to get the count from a dataframe from a Dash Callback

此生再无相见时 提交于 2021-01-28 06:47:45

问题


I'd like to display the count of certain criteria inside a div in my dash layout based off callback selection from dropdown.

I'm able to get the dropdown for the values in a pandas dataframe column, but I'm having trouble figuring out how to display the total count of the a selected element of the column.

For example, I've written a function in Jupyter notebook to get a count

def getCount(df, selected_org):
    totCount = df[df['ORGANIZATIONS'] == selected_org].AGENCY.count()
    return count

selected_org = 'REGION 1'

getCount(df, selected_org)

Which displays a value of: 3187

This value is the result of my selected_org variable.

Now, I'd like to do the same thing in my dash layout based off the selection from dropdown. I used much of the code here to get started from Udemy course: Interactive Python Dashboards with Plotly and Dash

I start with my layout:

org_options = []
for org in df['ORG_CODE_LEVEL_2_SHORT'].unique():
org_options.append({'label': str(org), 'value': org})

app.layout = html.Div(children=[

html.Label('Select Org:'),
    dcc.Dropdown(id='org-dropdown', options=org_options, 
    value=df['ORG_CODE_LEVEL_2_SHORT'].min()),
html.P(html.Div(id='container'))

Then my call back:

@app.callback(
    Output(component_id='container', component_property='children'), 
[Input(component_id='org-dropdown', component_property='value')])
def update_table(selected_org):
    filtered_org = df[df['ORG_CODE_LEVEL_2_SHORT'] == selected_org]
    return getCount(df, filtered_org)

And a function to generate the count:

def getCount(df, selected_org):

    totCount = df[df['ORG_CODE_LEVEL_2_SHORT'] == 
               selected_org].AGENCY_INFO_5.count()

return html.H2(totCount)

Which give me the following:

But it isn't giving me the count. Any help is appreciated.

Final complete program:

import os
import glob
import pandas as pd
import numpy as np
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

app = dash.Dash()

# DATA FROM EEPROFILE
path = r'mydata'
extension = 'xlsx'
os.chdir(path)
files = [i for i in glob.glob('*.{}'.format(extension))]
latest_file = max(files, key=os.path.getctime)
df = pd.DataFrame()
eeprofi = pd.read_excel(latest_file, converters={'ORG_CODE_LEVEL_3': str})
df = df.append(eeprofi)

def getCount(df, selected_org):

    totCount = df[df['ORG_CODE_LEVEL_2_SHORT'] == selected_org].AGENCY_INFO_5.count()

    return html.H2(totCount)

org_options = []
for org in df['ORG_CODE_LEVEL_2_SHORT'].unique():
    org_options.append({'label': str(org), 'value': org})

app.layout = html.Div(children=[

    html.Label('Select Org:'),
    dcc.Dropdown(id='org-dropdown', options=org_options, value=df['ORG_CODE_LEVEL_2_SHORT'].min()),
    html.P(html.Div(id='container'))

])

@app.callback(
    Output(component_id='container', component_property='children'), [Input(component_id='org-dropdown', component_property='value')])
def update_table(selected_org):
    filtered_org = df[df['ORG_CODE_LEVEL_2_SHORT'] == selected_org]
    return getCount(df, filtered_org)


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

回答1:


Your input is a children so you should return a list and not html.H2(your_count) like you did ;) so the solution is to replace this function

def getCount(df, selected_org):

    totCount = df[df['ORG_CODE_LEVEL_2_SHORT'] == selected_org].AGENCY_INFO_5.count()

    return html.H2(totCount)

by this one :

def getCount(df, selected_org):

    totCount = df[df['ORG_CODE_LEVEL_2_SHORT'] == selected_org].AGENCY_INFO_5.count()

    return [html.H2(totCount)]


来源:https://stackoverflow.com/questions/51989212/how-to-get-the-count-from-a-dataframe-from-a-dash-callback

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!