在 python 中使用 panda 库和 Dash Plotly 创建带有标签和值的下拉菜单

Posted

技术标签:

【中文标题】在 python 中使用 panda 库和 Dash Plotly 创建带有标签和值的下拉菜单【英文标题】:Create Dropdown with label and values using panda library and Dash Plotly in python 【发布时间】:2019-04-30 13:53:32 【问题描述】:

我在 Python 中使用 panda 库来读取 csv 文件并填充下拉列表。我的应用程序使用 Dash Plotly 创建 html Web 界面。我只填充了下拉列表的值,下拉列表的标签与值相同。如何将标签更改为 csv 文件中的文本?

available_rpi.csv

ip,name
192.168.1.6,"Virtual I²C (192.168.1.6)"
192.168.1.102,"GPS UART (192.168.1.102)"
192.168.1.106,"Ultrasonic I²C (192.168.1.103)"

python 脚本:

import dash,requests,pandas as pd

df = pd.read_csv('available_rpi.csv', usecols = ['ip','name'])
available_rpi = df['ip'].unique()

app.layout = html.Div( [
    html.H1(children='RESENSE'),
    html.Div(children='''RESENSE: Transparent Record and Replay in the Internet of Things (IoT).'''),
    # html.Div(['Name : ', dcc.Input(id='input',value='ACC',type='text') ]),
    # dcc.Markdown(''' '''),
    html.Label('Raspberry Pi'),
    dcc.Dropdown(
        id = "input",
        options=['label': i, 'value': i for i in available_rpi],
        value=''
    ),
    html.Div(id='output'),
    #   Graph for arriving data (static)
    dcc.Graph(id='data', animate=True),
    dcc.Interval(id='graph-update',interval=2*1000)
    ])

【问题讨论】:

【参考方案1】:

您应该使用orient='records' 将您的 .csv 文件存储为字典列表,然后使用列表推导为您的下拉组件设置选项:

import dash
import pandas as pd
import dash_core_components as dcc
import dash_html_components as html

available_rpi = pd.read_csv('available_rpi.csv').to_dict(orient='records')

app = dash.Dash(__name__)

app.layout = html.Div([

    html.H1(children='RESENSE'),

    html.Div(children='''RESENSE: Transparent Record and Replay in the Internet of Things (IoT).'''),

    html.Label('Raspberry Pi'),

    dcc.Dropdown(
        id = "input",
        options=['label': i['name'], 'value': i['ip'] for i in available_rpi],
        value=''
    ),

    html.Div(id='output'),

    #Graph for arriving data (static)
    dcc.Graph(id='data', animate=True),

    dcc.Interval(id='graph-update',interval=2*1000)

])

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

【讨论】:

不起作用。您将 i 用于 labelvalue 已修改以满足您的要求。一开始误读了你的问题,我的答案被编辑了。【参考方案2】:

用 pandas 以稍微不同的方式读取 CSV 数据并将其存储在字典中怎么样?

import dash
import pandas as pd
import dash_core_components as dcc
import dash_html_components as html

df = pd.read_csv('available_rpi.csv', usecols = ['ip','name'])
available_rpi = df.to_dict('records')

app = dash.Dash(__name__)

app.layout = html.Div( [
    html.H1(children='RESENSE'),
    html.Div(children='''RESENSE: Transparent Record and Replay in the Internet of Things (IoT).'''),
    # html.Div(['Name : ', dcc.Input(id='input',value='ACC',type='text') ]),
    # dcc.Markdown(''' '''),
    html.Label('Raspberry Pi'),
    dcc.Dropdown(
        id = "input",
        options=['label': i['name'], 'value': i['ip'] for i in available_rpi],
        value=''
    ),
    html.Div(id='output'),
    #   Graph for arriving data (static)
    dcc.Graph(id='data', animate=True),
    dcc.Interval(id='graph-update',interval=2*1000)
    ])

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

【讨论】:

【参考方案3】:

我必须使用字典....

available_rpi = pd.read_csv('available_rpi.csv', header=None, dtype=0: str).set_index(0).squeeze().to_dict()
#print("Raspberry Pi's available:")
#for key, car in available_rpi.items():
#    print(' : '.format(key, car))

app.layout = html.Div( [
    html.H1(children='RESENSE'),
    html.Div(children='''RESENSE: Transparent Record and Replay in the Internet of Things (IoT).'''),
    # html.Div(['Name : ', dcc.Input(id='input',value='ACC',type='text') ]),
    # dcc.Markdown(''' '''),
    html.Label('Raspberry Pi'),
    dcc.Dropdown(
        id = "input",
        options=['label': v, 'value': k for k, v in available_rpi.items()],
        value=''
    ),
    html.Div(id='output'),
    #   Graph for arriving data (static)
    dcc.Graph(id='data', animate=True),
    dcc.Interval(id='graph-update',interval=2*1000)
    ])

【讨论】:

顺便说一句,这仍然不是一个完整的 Dash 应用程序。您缺少必要的导入库,以及基本结构 是的。不完整,我只复制了我有问题的部分。我没有复制导入

以上是关于在 python 中使用 panda 库和 Dash Plotly 创建带有标签和值的下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQLAlchemy 和 Pandas 插入数据 - Python

使用 python pandas 将 json 转换为 csv

Python Pandas 中 DataFrame 的聚合?

使用 Pandas 删除 Python 中的多余行 [重复]

如何使用 python pandas 打开 nxs 文件?

列和行操作 Python Pandas