我正试图根据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.table
或st.dataframe
在流媒体应用中显示数据帧