Streamlit - 将 value_counts / groupby 应用于运行时选择的列

Posted

技术标签:

【中文标题】Streamlit - 将 value_counts / groupby 应用于运行时选择的列【英文标题】:Streamlit - Applying value_counts / groupby to column selected on run time 【发布时间】: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'

【问题讨论】:

【参考方案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 方法)。

【讨论】:

以上是关于Streamlit - 将 value_counts / groupby 应用于运行时选择的列的主要内容,如果未能解决你的问题,请参考以下文章

将文件的文件大小存储在变量 Streamlit 中

根据 pandas 数据框中的条件将 value_counts 与 groupby 函数一起使用并插入新列

如何从 Javascript 向 Streamlit 发送数据?

将使用 Streamlit 上传的图像转换为 numpy 数组

Streamlit:如何将变量的值存储在缓存中

没有名为 streamlit.__main__ 的模块; ‘streamlit’是一个包,不能直接执行