Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Only list-like objects are allowed to be passed to isn()

I have a dropdown menu:

                            dcc.Dropdown(
                                          id="select",
                                          options = list(all_df['Device'].unique()),
                                          value = list(all_df['Device'].unique()[0])
                                          )    
                            dcc.Graph(id = 'shared' 
                                          , figure={}
                                          ),

to enable a selection of a device (or devices) to plot later on:

@app.callback(
              Output("shared", "figure"), 
              Input("select", "value")
              )
def update_signal_chart(select):
    df4 = all_df[all_df['Device'].isin(select)] 

(…)

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

and whatever I try, it’s always resulting in

TypeError: only list-like objects are allowed to be passed to isin(), you passed a [str]

or

TypeError: only list-like objects are allowed to be passed to isin(), you passed a nonetype 

or the like. I don’t understand what I am doing wrongly resp. what I shall change into what. The data frame looks as:

all_df.head()
Out[63]: 
                        time        V+  ...     I_fil                 Device
0 2022-09-27 11:56:22.733740  7.980062  ...  5.035886                   A
1 2022-09-27 11:56:22.733940  7.982012  ...  5.032311                   A
2 2022-09-27 11:56:22.734140  7.983312  ...  5.027761                   A
3 2022-09-27 11:56:22.734340  7.983962  ...  5.022236                   A
4 2022-09-27 11:56:22.734540  7.982987  ...  5.016711                   A

Here is the entire code of the dash:

all_df = pd.read_csv("out.csv"
                                    #, parse_dates=['time']
                                    , dayfirst=True
                                    , skiprows=4
                                    , sep=","
                                    , decimal='.')
    
df2 = all_df.melt(id_vars=['Device','time'], value_vars=['V+','V-','I_A', 'I_fil'])

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, title='Dashboard', external_stylesheets=external_stylesheets)  

colors = {
        'background': '#000000',
        'text': '#f3ff00'
        }

# Define the app
app.layout = html.Div(
                    children = [
    
                            html.Div([
                                    html.H4('Dauertest'),
                                    html.Div(children = ""),

                                    # Draw graph
                                    dcc.Graph(id = 'General' 
                                              , figure={}
                                              ),
                                    ]),
                                    dcc.Checklist(
                                                  id="signals",
                                                  options = ['V+', 'V-', 'I_A', 'I_fil'],
                                                  value = ['V+', 'V-'],
                                                  inline=True
                                                  ),
                                    html.Br(),
                                    html.Br(),
                                    html.Br(),
                                    
                            # New row
                            html.Div([
                                html.Div([           
                                    dcc.Dropdown(
                                                  id="select",
                                                  options = list(all_df['Device'].unique()),
                                                  value = list(all_df['Device'].unique()[0])
                                                  ),                                    
                                    dcc.Graph(id = 'shared' 
                                              , figure={}
                                              ),
                                        #], className='six columns'),
                                        ], className='twelve columns'),
                                    ], className='row')
])


@app.callback(
              Output("General", "figure"), 
              Input("signals", "value")
              )
def update_line_chart(signals):
    df3=df2[df2['variable'].isin(signals)]    
    

    fig_general = px.scatter(df3
                              , x = "time"
                              , y = 'value'
                              , color = 'Device'
                              , symbol = 'variable'
                              , hover_name = "Device"
                              , template = 'plotly_dark'
                              #, marginal_y="rug"
                              ).update_layout(
                                              transition_duration = 500
                                              , autosize = True
                                              , height = 700
                                              )

    return fig_general

@app.callback(
              Output("shared", "figure"), 
              Input("select", "value")
              )
def update_signal_chart(select):
    # Subset data frame to choose between devices
    # df4 = all_df[all_df['Device'].isin(select)] 
    df4 = all_df[all_df['Device'] == select]

    fig_shared = make_subplots(rows = 4
                               , cols = 1
                               , shared_xaxes=True
                               , vertical_spacing=0.05
                               )
    
    fig_shared.add_trace(go.Scattergl(
                                    x = all_df['time']
                                    , y = all_df['V+']
                                    , mode = "markers"
                                    , name="V+"
                                    , connectgaps = False
                                    #, hoverinfo  = '"Device'
                                    , marker=dict(
                                    #               color = 'LightSkyBlue'
                                    #               , size = 20
                                    #               , line = dict(
                                    #                           color='MediumPurple'
                                    #                           , width=2
                                    #                           )
                                                    symbol = "circle"
                                                    )
                                    )
                          , row=4
                          , col=1
                          )
    
    fig_shared.add_trace(go.Scattergl(
                                    x = all_df['time']
                                    , y = all_df['V-']
                                    , name="V-"
                                    , mode = "markers"
                                    , marker=dict(
                                                  symbol = "star"                
                                                  )
                                    )
                        , row=3
                        , col=1
                        )
    
    fig_shared.add_trace(go.Scattergl(
                                    x = all_df['time']
                                    , y = all_df['I_A']
                                    , name="I_A"
                                    , mode = "markers"
                                    , marker=dict(
                                                  symbol = "diamond"                
                                                  )
                                    )
                        , row=2
                        , col=1
                        )
    
    fig_shared.add_trace(go.Scattergl(
                                    x = all_df['time']
                                    , y = all_df['I_fil']
                                    , name="I_fil"
                                    , mode = "markers"
                                    , marker=dict(
                                                  symbol = "x"                
                                                  )
                                    )
                        , row=1
                        , col=1
                        )
    
    fig_shared.update_layout(
                            height= 1000
                            , width = 1900
                            , title_text = ""
                            , template = 'plotly_dark'
                            #, font=dict(
                            #            family = "Courier New, monospace"
                            #            , size = 18
                            #            , color = "RebeccaPurple"
                            #            )
                            )

    fig_shared.show()
    
    fig_shared['layout']['yaxis']['title'] = 'I_fil / A'
    fig_shared['layout']['yaxis2']['title'] = 'I_A / A'
    fig_shared['layout']['yaxis3']['title'] = 'V- / V'
    fig_shared['layout']['yaxis4']['title'] = 'V+ / V'
    
    
    return fig_shared


# Run the app
if __name__ == "__main__":
    app.run_server(
                    debug=False
                    , port=8050
                    )

and the data: https://filebin.net/pag2dnsixti4ce9a

>Solution :

isin function is used to compare a series against a list, not a series against a value (str type in your problem). That is why you got this error only list-like objects are allowed to be passed to isin().

In your case, you want to retrieve all rows based on the selected device from a dropdown menu. You can achieve that like so:

df4 = all_df.query('Device==@select')
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading