Streamlit—将value_counts/groupby应用于运行时选定的列



我正试图根据Streamlit应用程序中动态选择的列,将value_counts方法应用于数据帧

这就是我要做的:

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.Series对象(它具有value_counts方法(。但是,当您传递列列表时,您会返回一个pandas.DataFrame(上面没有定义value_counts方法(。

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

我认为错误是因为value_counts((适用于Series,而不适用于数据帧。

您可以尝试转换"。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在流媒体应用中显示数据帧

最新更新