Hi everyone. I had some fun today making streamlit’s multiselect options
behave together in a co-dependent manner. This post here isn’t an issue but rather an observation of how to get something extra out of the system (with scope for change in the future? Or at least a guide on something other people may find interesting).
I’ve set up a system where a user selects an option from one multiselect box and, based upon their selection, the options for a second multiselect will be changed according to values in a pre-existing data structure.
Let’s say we have a dataframe called df:
| 'A' | 'B' | 'C' |
1 4 6 1
2 6 4 2
3 6 9 3
And I set up some columns:
col1, col2, col3 = st.beta_columns(3)
Right now, if I want to use a dependent chain of multiselects whose options depended on what I chose for a previous multiselect, here’s what I can do:
with col1:
option1 = st.multiselect("Option 1", list(set(df.iloc[:, 0])))
with col2:
option2 = st.multiselect("Option 2", list(set(df.loc[(df.iloc[:, 0].isin(option1))][df.columns[1]])))
with col3:
option3 = st.multiselect("Option 3", list(set(df.loc[(df.iloc[:, 0].isin(option1)) & (df.iloc[:, 1].isin(option2))][df.columns[2]])))
user_choice = list(product(*[option1, option2, option3]))
If the user chooses 6 for option 1, option2 will present options 4 and 9, whereas if the user chooses 4 for option 1, option2 will present only 6. So far so good. Now image you have six chained dependent options, each requiring more and more lines of code to whittle down the choices of the dataframe (because option3 would need to do an iloc of both option 1 and 2, and so on). Gets a bit heavy with 6 in total, but it gets the job done.
Note: invalid combinations may be present in user_choice
, so they need to be parsed manually.
I’m wondering if there would be a possible cleaner solution to this issue? Incorporating linked keys so that multiselect widgets could operate in a hierarchy is a potential option (and potential nightmare). Or maybe this is more an issue of cleaner coding in python to not abuse the limitations of streamlit?