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.table
或st.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 应用于运行时选择的列的主要内容,如果未能解决你的问题,请参考以下文章
根据 pandas 数据框中的条件将 value_counts 与 groupby 函数一起使用并插入新列
如何从 Javascript 向 Streamlit 发送数据?