【问题标题】:Filtering pandas based on varying conditions as inputs form the user根据用户输入的不同条件过滤熊猫
【发布时间】:2020-06-19 13:59:23
【问题描述】:

我正在尝试根据用户的输入过滤 df。从图片中可以看到,我从 4 个下拉菜单中接收输入。每个下拉菜单都是来自 DF 的一列的 unique() 但是,我在下拉菜单的列表顶部添加了单词 "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)并为 pandas 构建过滤器

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 语句,除非它真的是唯一的希望

抱歉,这篇文章太长了,但我试图尽可能详尽

【问题讨论】:

  • 您不能添加另一列,所有行都由文本填充All,然后在用户选择时使用该列过滤All 下拉列表?
  • XXavier,当所有过滤器返回“All”时打印完整的 DF 不是我的问题。我的问题是当其中一个设置为“All”而其他 3 个没有设置时。如果一个过滤器设置为“全部”,我收到一个空的 DF .. 显然,用于过滤器的整体真值表变为错误。对我来说,“全部”应将此列从搜索条件中排除。所以,我不确定我是否理解用“全部”一词填充的列会有什么帮助..
  • 对不起,我误解了这个问题。这样的过滤器有什么问题? df[(df["Reporting Status"] == rprt_status) & (df["Source"] == src) & (df["Contract Type"] == cntrct_type) & (df["Country"] == country)]["CPM"] 选择All 会发生什么?
  • Xavier 不用担心,过滤器没有问题,就好像它从它所查找的唯一系列中接收一个值一样。问题是,如果我想从 4 个中取 3 个(如果一个的变量来作为“全部”.. 在这种情况下,我想禁用这个条件过滤这个列
  • 请试试下面的答案

标签: python python-3.x pandas filter dropdown


【解决方案1】:

你可以试试这个吗?这里我假设文本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"]

【讨论】:

  • 谢谢 XXavier,它对代码进行了一些修改。感谢您的所有帮助
【解决方案2】:

我通常使用的标准模式类似于

filter = lambda x: 选择 == 'All' 或选择 == x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2017-11-20
    • 1970-01-01
    • 2018-08-09
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多