首页 > 解决方案 > 根据用户输入的不同条件过滤熊猫

问题描述

我正在尝试根据用户的输入过滤 df。从图片中可以看到,我从 4 个下拉菜单中接收输入。每个下拉菜单都是unique()来自 DF 的一列,但是,我将单词添加"All"到下拉菜单的列表顶部以禁用该特定过滤器并显示没有该过滤器的 DF。
下拉菜单

这就是构建每个菜单列表的方式

def unique(df,col_nme,**kwargs):
lst_nme=df[col_nme].unique()
lst_nme=list(lst_nme)
lst_nme.insert(0,"All")
return lst_nme

然后我将它们设置为显示(使用streamlit)并为熊猫构建过滤器

lst_rprt_status = unique(df, "Reporting Status")
rprt_status = st.sidebar.selectbox("Reporting Status", lst_rprt_status)
lst_src = unique(df, "Source")
src = st.sidebar.selectbox("Source", lst_src)
lst_cntrct_type = unique(df, "Contract Type")
cntrct_type = st.sidebar.selectbox("Contract Type", lst_cntrct_type)
lst_country = unique(df, "Country")
country = st.sidebar.selectbox("Country", lst_country)

filt_status = df["Reporting Status"] == rprt_status
filt_src = df["Source"] == src
filt_cntrct_type = df["Contract Type"] == cntrct_type
filt_country = df["Country"] == country

如果所有名称都返回"All",即用户加载页面,这是一个非常简单的 if 语句,我只显示完整的 DF 但是,如果我开始从菜单中选择要过滤的值而其他菜单仍处于“全部" 或者我想"All"在选择它之后将其更改为,那么我在为 DF 构建组合过滤器时遇到问题。我尝试阅读有关 df.query 的信息,但我会遇到同样的问题。

所以基本上我在这里尝试做的是有一种过滤器形式,如 bleow:

        df_filtered = df[(df["Reporting Status"] == "Pending") &
                     (df["Source"] == "All") &
                     (df["Contract Type"] == "CSA") &
                     (df["Country"] == "Egypt")]["CPM"]

具有删除特定行的能力,如果它的关联条件== "All",在上面的例子中,将是df["Source"] == "All"或添加它不是当它不是。
我还尝试使用字符串操作构建完整的句子,但最终没有成功,我不想为所有会产生结果的组合运行 if 语句,除非它真的是唯一的希望

很抱歉这篇文章很长,但我试图尽可能彻底

标签: pythonpython-3.xpandasfilterdropdown

解决方案


你能试试这个吗?在这里,我假设文本All保留用于选择所有行。

我正在做的是首先检查所选输入是否在唯一列表中,如果不是,那么我通过创建True布尔值来选择所有行。

msk1 = df["Reporting Status"] == rprt_status if rprt_status in lst_rprt_status else True
msk2 = df["Source"] == src if src in lst_src else True
msk3 = df["Contract Type"] == cntrct_type if cntrct_type in lst_cntrct_type else True
msk4 = df["Country"] == country if country in lst_country else True

df_filtered = (df[msk1 & msk2 & msk3 & msk4])["CPM"]


推荐阅读