【发布时间】: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