Plotly Dash:多选下载不工作

Plotly Dash: Multiple Selection Download Not Working

我正在尝试构建一个 dash 应用程序,我可以在其中 select 基于过滤器和下载的数据,如 table 中所示。因此,当我下载一个 select 离子的数据时,它可以正常工作,但是当我 select 多个状态的数据时,它会给出一个空白文件。 谁能帮我,这里出了什么问题?

import dash
import dash_core_components as dcc
import dash_html_components as html
import urllib.parse
import pandas as pd

df = pd.read_csv(
    'https://gist.githubusercontent.com/chriddyp/'
    'c78bf172206ce24f77d6363a2d754b59/raw/'
    'c353e8ef842413cae56ae3920b8fd78468aa4cb2/'
    'usa-agricultural-exports-2011.csv')


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


app = dash.Dash()

app.layout = html.Div(children=[
    html.H4(children='US Agriculture Exports (2011)'),
    dcc.Dropdown(id='dropdown', options=[
        {'label': i, 'value': i} for i in df.state.unique()
    ], multi=True, placeholder='Filter by state...'),
    html.Div(id='table-container'),
    html.A('Download Data', id='download-link', download="rawdata.csv", href="", target="_blank")
])


def filter_data(value):
    if value is None:
        return df
    else:
        return df[df['state'] == '|'.join(value)]


@app.callback(
    dash.dependencies.Output('table-container', 'children'),
    [dash.dependencies.Input('dropdown', 'value')])
def display_table(dropdown_value):
    if dropdown_value is None:
        return generate_table(df)

    dff = df[df.state.str.contains('|'.join(dropdown_value))]
    return generate_table(dff)


@app.callback(
    dash.dependencies.Output('download-link', 'href'),
    [dash.dependencies.Input('dropdown', 'value')])
def update_download_link(filter_value):
    dff = filter_data(filter_value)
    csv_string = dff.to_csv(index=False, encoding='utf-8')
    csv_string = "data:text/csv;charset=utf-8,%EF%BB%BF" + urllib.parse.quote(csv_string)
    return csv_string


# app.css.append_css({"external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css"})

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

filter_data()函数returns一个空数据框,这就是为什么从应用程序下载的 CSV 文件是空的。

import pandas as pd

df = pd.read_csv('https://gist.githubusercontent.com/chriddyp/c78bf172206ce24f77d6363a2d754b59/raw/c353e8ef842413cae56ae3920b8fd78468aa4cb2/usa-agricultural-exports-2011.csv')

def filter_data(value):
    if value is None:
        return df
    else:
        return df[df['state'] == '|'.join(value)]

df1 = filter_data(['Alabama', 'Alaska', 'Arizona'])
df1.head()

Empty DataFrame
Columns: [Unnamed: 0, state, total exports, beef, pork, poultry, dairy, fruits fresh, fruits proc, total fruits, veggies fresh, veggies proc, total veggies, corn, wheat, cotton]
Index: []

如果您重新定义 filter_data() 函数,应用程序将按预期运行。

def filter_data(value):
    if value is None:
        return df
    else:
        return df[df['state'].isin(value)]

df2 = filter_data(['Alabama', 'Alaska', 'Arizona'])
df2.head()

   Unnamed: 0    state  total exports  beef  ...  total veggies  corn  wheat  cotton
0           0  Alabama        1390.63  34.4  ...          14.33  34.9   70.0  317.61
1           1   Alaska          13.31   0.2  ...           1.56   0.0    0.0    0.00
2           2  Arizona        1463.17  71.3  ...         386.91   7.3   48.7  423.95
[3 rows x 16 columns]