如何使用 pandas 和 python 中的 streamlit 替换数据框上的值?

how to replace values on a dataframe using pandas and streamlit in python?

我有一个 python 脚本,它使用 pandas 读取数据帧并使用 streamlit 显示其内容。

我想要的是根据用户输入将当前值替换为新值

其中用户 select 所需的列 然后在文本字段中输入 当前值 而不是 new value 在第二个文本字段中当按钮 replace 被按下时 old value 被替换为 新值并显示新数据框。

问题是当它显示数据帧时没有任何改变

代码:

import pandas as pd 
import streamlit as st 


df =pd.DataFrame({
            "source_number":                        [ 
             [11199,11328,11287,32345,12342,1232,13456,123244,13456],
             "location":          
             ["loc2","loc1","loc3","loc1","loc2","loc2","loc3","loc2","loc1"],
              "category": 
             ["cat1","cat2","cat1","cat3","cat3","cat3","cat2","cat3","cat2"],
             })  

columns = st.selectbox("Select  column", df.columns)
old_values = st.multiselect("Current Values",list(df[columns].unique()),list(df[columns].unique()))
col1,col2 = st.beta_columns(2)
with col1:
     old_val = st.text_input("old value")
with col2:
     new_val = st.text_input("new value")
if st.button("Replace"):
      df[columns]=df[columns].replace({old_val:new_val})
      st.dataframe(df)    

你的代码有点错误。

df[columns]=df[columns].replace({old_val:new_val})

当您查看示例中的 pandas 文档时,会有这样的代码

s.replace({'a': None}) - it replaces value 'a' with None value

当查看您的代码时,这意味着什么,您正在尝试用另一个列表替换作为列表的值,但它不会那样工作,因为您的列没有列表作为元素,所以不能那样改变。 当我 运行 你在 Jupyter 中的代码时,我得到一个列表不可散列的错误

--------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-41a02888936d> in <module>
     30 oldVal = [11199,11328,11287,32345]
     31 
---> 32 df["source_number"] = df["source_number"].replace({oldVal:newVal})
     33 df

TypeError: unhashable type: 'list'

这就是它对您没有任何改变的原因。

如果您想使用列表更改所有值,则必须这样写:

df[column] = df[column].replace(old_values, new_values)

这段代码工作得很好。

我希望我说得足够清楚,它对你有用。

您的代码适用于 text 列(locationcategory)。它不适用于 numeric source_number 列,因为您正试图将一个 string 替换为另一个。

对于数字列,您需要使用 number_input 而不是 text_input:

import pandas as pd
from pandas.api.types import is_numeric_dtype
import streamlit as st


df = pd.DataFrame({
            "source_number":
             [11199,11328,11287,32345,12342,1232,13456,123244,13456],
             "location":
             ["loc2","loc1","loc3","loc1","loc2","loc2","loc3","loc2","loc1"],
              "category":
             ["cat1","cat2","cat1","cat3","cat3","cat3","cat2","cat3","cat2"],
             })

columns = st.selectbox("Select  column", df.columns)
old_values = st.multiselect("Current Values",list(df[columns].unique()),list(df[columns].unique()))
col1,col2 = st.beta_columns(2)
st_input = st.number_input if is_numeric_dtype(df[columns]) else st.text_input
with col1:
     old_val = st_input("old value")
with col2:
     new_val = st_input("new value")
if st.button("Replace"):
     df[columns]=df[columns].replace({old_val:new_val})
     st.dataframe(df)

根据评论更新:您可以缓存 df 以防止在每次小部件交互时重新初始化(您必须手动清除缓存才能重新开始):

@st.cache(allow_output_mutation=True)
def get_df():
   return pd.DataFrame({
            "source_number":
             [11199,11328,11287,32345,12342,1232,13456,123244,13456],
             "location":
             ["loc2","loc1","loc3","loc1","loc2","loc2","loc3","loc2","loc1"],
              "category":
             ["cat1","cat2","cat1","cat3","cat3","cat3","cat2","cat3","cat2"],
             })

df = get_df()