0

我正在尝试根据 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'
4

3 回答 3

0

您可以尝试将“.value_counts”输出转换为数据框

如果您想在单个列上应用

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)

如果要申请数据框中的所有对象列

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在您的流式应用程序中显示数据框

于 2021-12-26T08:17:22.260 回答
0

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

于 2020-02-26T21:50:39.780 回答
0

你能试一下吗st.table(new_df[col_name].value_counts())

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

于 2021-12-22T07:10:07.573 回答