I have a python code that display dataframe and allow the user to filter the dataframe by creating a new dataframe and allow him to update the requested record using the index number from the selectedbox.
For this reason i am using the new feature of streamlit session state where i want the system to preserve the filtered dataframe after the user change the the value of the selectbox by using the callback feature
The problem is that once the user select the value from the selectbox the system crash and display the below error:
TypeError: 'DataFrame' object is not callable
Traceback:
File "F:\AIenv\lib\site-packages\streamlit\script_runner.py", line 347, in _run_script
self._session_state.call_callbacks()
File "F:\AIenv\lib\site-packages\streamlit\state\session_state.py", line 379, in call_callbacks
self._new_widget_state.call_callback(wid)
File "F:\AIenv\lib\site-packages\streamlit\state\session_state.py", line 203, in call_callback
callback(*args, **kwargs)
import pandas as pd
import streamlit as st
def update_df(new_df):
return pd.DataFrame(new_df)
def main():
df=pd.read_csv(data)
df_result_search = pd.DataFrame.from_records(df, columns = [column[0] for column in cursor.description])
df_len = range(len(df_result_search.index))
s = st.selectbox('Select index',key="select_box",options=df_len,on_change=update_df(df_result_search))
expander_updates_fields = st.beta_expander('Update Records')
with expander_updates_fields:
for i, col in enumerate(df.columns):
if not s == 0:
val_update = st_input_update('Update {} from {} to:'.format(col, df[col].values[s]))
expander_updates_fields.markdown(val_update, unsafe_allow_html=True)
else:
st.write("DataFrame is empty")
if __name__=='__main__':
main()
based on the answer of Joran Beasley
the system return the selected value but is not showing the dataframe
after the user select the value the page refresh this what is happening:
So for this reason i used the callback()
what i want is to :
How can I achieve these 3 tasks???
try doing
on_change=lambda: update_df(df_result_search)
before you basically had
a_df = update_df(df_result_search)
... on_change=a_df
on_change needs a function that it can call ... it cannot call the dataframe returned ... in the suggested solution we simply convert it into a lambda that will be called when the select choice is changed.
(of coarse it probably passes some sort of "change_event" that you should probably use to select a column or something)
...on_change= lambda evt:do_something_with_event(evt)
on further examination I think you do not quite understand how streamlit works
this example should help you understand why you still have some issues
import streamlit as st
def main():
s = st.selectbox('Select index',key="select_box",options=['a','b','c'],on_change=lambda *a:print("Old selection:",s))
print("Current selection:",s) # now do something with it
if __name__=='__main__':
main()