【问题标题】:Streamlit - Applying value_counts / groupby to column selected on run timeStreamlit - 将 value_counts / groupby 应用于运行时选择的列
【发布时间】:2020-06-10 16:04:57
【问题描述】:

我正在尝试根据 Streamlit 应用程序中动态选择的列将 value_counts 方法应用于 Dataframe

这就是我想要做的:

if st.checkbox("Select Columns To Show"):
    all_columns = df.columns.tolist()
    selected_columns = st.multiselect("Select", all_columns)
    new_df = df[selected_columns]
    st.dataframe(new_df)

以上内容让我选择列并显示所选列的数据。我正在尝试查看如何在 Streamlit 应用程序的此输出上应用 value_counts/groupby 方法

如果我尝试执行以下操作

st.table(new_df.value_counts())

我收到以下错误

AttributeError: 'DataFrame' object has no attribute 'value_counts'

【问题讨论】:

    标签: pandas pandas-groupby streamlit


    【解决方案1】:

    您可以尝试转换".value_counts" output to dataframe

    如果你想在单个列上应用

    def value_counts_df(df, col):
        """
        Returns pd.value_counts() as a DataFrame
    
        Parameters
        ----------
        df : Pandas Dataframe
            Dataframe on which to run value_counts(), must have column `col`.
        col : str
            Name of column in `df` for which to generate counts
    
        Returns
        -------
        Pandas Dataframe
            Returned dataframe will have a single column named "count" which contains the count_values()
            for each unique value of df[col]. The index name of this dataframe is `col`.
    
        Example
        -------
        >>> value_counts_df(pd.DataFrame({'a':[1, 1, 2, 2, 2]}), 'a')
           count
        a
        2      3
        1      2
        """
        df = pd.DataFrame(df[col].value_counts())
        df.index.name = col
        df.columns = ['count']
        return df
    
    val_count_single = value_counts_df(new_df, selected_col)
    

    如果要申请all object columns in the dataframe

    def valueCountDF(df, object_cols):
    
        c = df[object_cols].apply(lambda x: x.value_counts(dropna=False)).T.stack().astype(int)
    
        p = (df[object_cols].apply(lambda x: x.value_counts(normalize=True,
                                                           dropna=False)).T.stack() * 100).round(2)
    
        cp = pd.concat([c,p], axis=1, keys=["Count", "Percentage %"])
        return cp
    
    val_count_df_cols = valueCountDF(df, selected_columns)
    

    最后,您可以使用st.tablest.dataframe 在您的流光应用中显示数据框

    【讨论】:

      【解决方案2】:

      你可以试试st.table(new_df[col_name].value_counts())

      我认为错误是因为 value_counts() 适用于系列而不是数据框。

      【讨论】:

        【解决方案3】:

        我认为问题在于将列列表传递给数据框。当您将 [] 中的单个列传递给数据框时,您将返回一个 pandas.Series 对象(具有 value_counts 方法)。但是当你传递一个列列表时,你会得到一个pandas.DataFrame(它没有定义value_counts 方法)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-02
          • 2021-07-21
          • 2014-06-05
          • 1970-01-01
          • 2019-01-18
          • 2021-12-13
          • 2018-12-14
          • 2021-09-02
          相关资源
          最近更新 更多