【发布时间】:2021-09-23 02:07:48
【问题描述】:
我有一个显示 dataframe 的 python 代码,允许用户通过创建 new dataframe 来过滤 dataframe,并允许他使用索引号更新请求的记录从选中框。
出于这个原因,我正在使用 streamlit 会话状态的新功能,我希望系统在 用户更改选择框的值后保留过滤后的数据帧通过使用回调功能
问题是一旦用户从选择框中选择值,系统就会崩溃并显示以下错误:
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()
基于乔兰·比斯利
的回答系统返回选定的值但不显示数据框
用户选择值后,页面刷新这是发生了什么:
- 数据框消失
- 选择框保存选择的值
- 更新扩展器返回每个记录中所有记录的所有值 列。
因此我使用了 callback()
我想要的是:
- 数据框仍然出现。
- 选择框保存选择的值
- 更新扩展器返回所选索引号的值 每个 列。
我怎样才能完成这 3 个任务???
【问题讨论】:
-
我跟进了另一个例子 ./.. 我猜你根本不关心
on_change并且你期望它像 javascript 中的 onchange 或其他东西一样工作......只需使用 s after你做出选择(它会在你改变它时回忆整个事情) -
我编辑我的问题并添加 expander update 以及发生了什么以及我想要实现的目标。
-
对不起,我不太明白你在做什么......:/
-
@ Joran Beasley 我想做的是允许用户首先根据 text_input 在数据框中进行搜索。然后我试图允许用户通过在 expander update 中显示与该记录相关的列的当前值来更新所选记录的值(从选择框)有没有更好的方法这个任务??
标签: python pandas onchange streamlit