【问题标题】:how to fix error "DataFrame object is not callable" in python and streamlit如何修复python和streamlit中的错误“DataFrame对象不可调用”
【发布时间】: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()
            

基于乔兰·比斯利

的回答

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

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

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

因此我使用了 callback()

我想要的是:

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

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

【问题讨论】:

  • 我跟进了另一个例子 ./.. 我猜你根本不关心 on_change 并且你期望它像 javascript 中的 onchange 或其他东西一样工作......只需使用 s after你做出选择(它会在你改变它时回忆整个事情)
  • 我编辑我的问题并添加 expander update 以及发生了什么以及我想要实现的目标。
  • 对不起,我不太明白你在做什么......:/
  • @ Joran Beasley 我想做的是允许用户首先根据 text_input 在数据框中进行搜索。然后我试图允许用户通过在 expander update 中显示与该记录相关的列的当前值来更新所选记录的值(从选择框)有没有更好的方法这个任务??

标签: python pandas onchange streamlit


【解决方案1】:

尝试做

on_change=lambda: update_df(df_result_search)

在你基本上拥有之前

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

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

(粗略的它可能会传递某种“change_event”,您可能应该使用它来选择一列或其他东西)

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

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

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

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

           

【讨论】:

  • 我将编辑我的问题并添加在我尝试了您的答案后显示的结果。
猜你喜欢
  • 2019-08-28
  • 2019-10-04
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
相关资源
最近更新 更多