Streamlit 自动填充多选小部件以过滤数据框
Streamlit auto populate multiselect widgets to filter dataframe
我有一个 streamlit 应用程序,用户可以在其中上传 csv 文件。我希望 streamlit 检测 object/dimension 列并为每个列创建一个 multiselect 过滤器,每个列内都有唯一值。例如,如果用户上传包含 3 object/dimension 的文件,将创建 3 个单独的多 select 过滤器。我想出了下面的代码,但它似乎不起作用。我最终遇到以下错误。我认为问题是通过创建每个 multiselect 过滤器循环,但我不确定另一种动态执行此操作的方法。我也试过用 data[y].unique()
代替 ucolumns
但这仍然不起作用。
任何帮助都会很棒。
for y in data.columns:
if (data[y].dtype == np.object):
ucolumns=list(data[y].unique())
data[y+"filter"]=st.sidebar.multiselect('Filter '+y, ucolumns)
else:
pass
ValueError: Length of values (0) does not match length of index (97)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\streamlit\script_runner.py", line 332, in _run_script
exec(code, module.__dict__)
File "C:\Users\###\PycharmProjects\pythonProject\streamlittest.py", line 109, in <module>
helper.run()
File "C:\Users\###\PycharmProjects\pythonProject\streamlittest.py", line 66, in run
data[y+"filter"]=st.sidebar.multiselect('Filter '+y, ucolumns)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\pandas\core\frame.py", line 3163, in __setitem__
self._set_item(key, value)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\pandas\core\frame.py", line 3239, in _set_item
value = self._sanitize_column(key, value)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\pandas\core\frame.py", line 3896, in _sanitize_column
value = sanitize_index(value, self.index)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\pandas\core\internals\construction.py", line 751, in sanitize_index
raise ValueError(
测试一些东西,我将 multiselect 包装在 try 和 except 中并打印 y
以查看哪些列进入异常。似乎所有维度列都进入了异常,但奇怪的是所有多 selects 都被创建并且似乎工作?谁能向我解释发生了什么事?这是我所做的调整:
try:
data[y+"filter"]=st.sidebar.multiselect('Filter '+y, ucolumns)
except:
print(y+"had to pass")
当您尝试将 streamlit 侧边栏分配给 pandas' DataFrame 列时出现问题。
这就是为什么当您允许执行继续执行 try/except 块时,侧边栏已设置,但无论如何都会引发异常。
换句话说,如果将有问题的行一分为二,您将得到以下内容:
sidebar = st.sidebar.multiselect('Filter '+y, columns) # <-- This line is OK
data[y+"filter"] = sidebar # <-- This line fails
该行失败,因为 data
是一个 pandas' DataFrame,因此 data[y+'filter'] 是一列。而且您不能将一个元素分配给一列,这就是相当神秘的错误消息中所述的内容:
ValueError: Length of values (0) does not match length of index (97)
这意味着您的数据框有 97 行,并且您正在分配一个独立元素(“长度为 0”)。
当你在 try/except 块中换行时,有效的部分(又名:st.sidebar.multiselect('Filter '+y, columns)
)被执行,这就是你得到侧边栏的原因:因为错误发生 在创建它之后。
您可以通过在字典中收集对边栏的引用来解决问题
sidebars = {}
for y in data.columns:
if (data[y].dtype == np.object):
ucolumns=list(data[y].unique())
sidebars[y+"filter"]=st.sidebar.multiselect('Filter '+y, ucolumns)
我有一个 streamlit 应用程序,用户可以在其中上传 csv 文件。我希望 streamlit 检测 object/dimension 列并为每个列创建一个 multiselect 过滤器,每个列内都有唯一值。例如,如果用户上传包含 3 object/dimension 的文件,将创建 3 个单独的多 select 过滤器。我想出了下面的代码,但它似乎不起作用。我最终遇到以下错误。我认为问题是通过创建每个 multiselect 过滤器循环,但我不确定另一种动态执行此操作的方法。我也试过用 data[y].unique()
代替 ucolumns
但这仍然不起作用。
任何帮助都会很棒。
for y in data.columns:
if (data[y].dtype == np.object):
ucolumns=list(data[y].unique())
data[y+"filter"]=st.sidebar.multiselect('Filter '+y, ucolumns)
else:
pass
ValueError: Length of values (0) does not match length of index (97)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\streamlit\script_runner.py", line 332, in _run_script
exec(code, module.__dict__)
File "C:\Users\###\PycharmProjects\pythonProject\streamlittest.py", line 109, in <module>
helper.run()
File "C:\Users\###\PycharmProjects\pythonProject\streamlittest.py", line 66, in run
data[y+"filter"]=st.sidebar.multiselect('Filter '+y, ucolumns)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\pandas\core\frame.py", line 3163, in __setitem__
self._set_item(key, value)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\pandas\core\frame.py", line 3239, in _set_item
value = self._sanitize_column(key, value)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\pandas\core\frame.py", line 3896, in _sanitize_column
value = sanitize_index(value, self.index)
File "c:\users\###\pycharmprojects\pythonproject\venv\lib\site-packages\pandas\core\internals\construction.py", line 751, in sanitize_index
raise ValueError(
测试一些东西,我将 multiselect 包装在 try 和 except 中并打印 y
以查看哪些列进入异常。似乎所有维度列都进入了异常,但奇怪的是所有多 selects 都被创建并且似乎工作?谁能向我解释发生了什么事?这是我所做的调整:
try:
data[y+"filter"]=st.sidebar.multiselect('Filter '+y, ucolumns)
except:
print(y+"had to pass")
当您尝试将 streamlit 侧边栏分配给 pandas' DataFrame 列时出现问题。
这就是为什么当您允许执行继续执行 try/except 块时,侧边栏已设置,但无论如何都会引发异常。
换句话说,如果将有问题的行一分为二,您将得到以下内容:
sidebar = st.sidebar.multiselect('Filter '+y, columns) # <-- This line is OK
data[y+"filter"] = sidebar # <-- This line fails
该行失败,因为 data
是一个 pandas' DataFrame,因此 data[y+'filter'] 是一列。而且您不能将一个元素分配给一列,这就是相当神秘的错误消息中所述的内容:
ValueError: Length of values (0) does not match length of index (97)
这意味着您的数据框有 97 行,并且您正在分配一个独立元素(“长度为 0”)。
当你在 try/except 块中换行时,有效的部分(又名:st.sidebar.multiselect('Filter '+y, columns)
)被执行,这就是你得到侧边栏的原因:因为错误发生 在创建它之后。
您可以通过在字典中收集对边栏的引用来解决问题
sidebars = {}
for y in data.columns:
if (data[y].dtype == np.object):
ucolumns=list(data[y].unique())
sidebars[y+"filter"]=st.sidebar.multiselect('Filter '+y, ucolumns)