如何修复python和Streamlight中的错误“DataFrame对象不可调用”

2024-05-15 23:38:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python代码,它显示数据框,允许用户通过创建新数据框来过滤数据框,并允许用户使用selectedbox中的索引号更新请求的记录

因此,我使用streamlight会话状态的新功能,我希望系统在用户使用回调功能更改selectbox的值后保留过滤后的数据帧

问题在于,一旦用户从选择框中选择值,系统将崩溃并显示以下错误:

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()
            

根据Joran Beasley的回答

系统返回所选值,但不显示数据帧

用户选择值后,页面将刷新以下内容:

  1. 数据帧消失器
  2. selectbox将保存选定的值
  3. 更新扩展器返回每个文件中所有记录的所有值 专栏

因此,我使用了回调()

我想做的是:

  1. 数据帧仍然出现
  2. selectbox将保存选定的值
  3. 更新扩展器将返回中所选索引号的值 每个 专栏

我如何完成这三项任务??

enter image description here


Tags: 数据用户indataframedf系统updatecall
1条回答
网友
1楼 · 发布于 2024-05-15 23:38:33

试着做

on_change=lambda: update_df(df_result_search)

在你基本上

a_df = update_df(df_result_search)
... on_change=a_df

on_change需要一个可以调用的函数。。。它无法调用返回的数据帧。。。在建议的解决方案中,我们只需将其转换为lambda,当select选项更改时将调用该lambda

(当然,它可能会传递某种“change_事件”,您可能应该使用它来选择列或其他内容)

...on_change= lambda evt:do_something_with_event(evt)

进一步检查后,我认为您不太了解Streamlight的工作原理

这个例子应该可以帮助您理解为什么仍然存在一些问题

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()

           

相关问题 更多 >