微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

出于这个原因,我使用流光会话状态的新功能,我希望系统在用户更改选择框的值后保留过滤后的数据帧通过使用回调功能

问题是一旦用户从选择框中选择值,系统就会崩溃并显示以下错误

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

基于乔兰·比斯利

的回答

系统返回选定的值但不显示数据框

用户选择值后页面刷新这是发生了什么:

  1. 数据框消失
  2. 选择框保存选中的值
  3. 更新扩展器返回每个记录中所有记录的所有值 列。

因此,我使用了callback()

我想要的是:

  1. 数据框仍然出现。
  2. 选择框保存选中的值
  3. 更新扩展器返回选定索引号中的值 每个 列。

我怎样才能完成这 3 个任务???

enter image description here

解决方法

尝试做

on_change=lambda: update_df(df_result_search)

在你基本上拥有之前

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

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

(粗略地说,它可能会传递某种“change_event”,您可能应该使用它来选择列或其他内容)

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

进一步检查我认为你不太了解streamlit是如何工作的

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

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

           

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。