根据用户输入的不同条件过滤熊猫

时间:2020-06-19 13:59:23

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

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

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

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_filtered = df[(df["Reporting Status"] == "Pending") & (df["Source"] == "All") & (df["Contract Type"] == "CSA") & (df["Country"] == "Egypt")]["CPM"] ,那么我在为DF构建组合过滤器时遇到问题。我尝试阅读有关df.query的信息,但遇到了同样的问题。

所以基本上,我在这里要做的是拥有一种类似bleow的过滤器形式:

== "All"

具有删除特定行的功能,如果在上例中该行的关联条件df["Source"] == "All"$DTCSettings = @( "NetworkDtcAccess", # Network DTC Access "NetworkDtcAccessClients", # Allow Remote Clients ( Client and Administration) "NetworkDtcAccessAdmin", # Allow Remote Administration ( Client and Administration) "NetworkDtcAccessTransactions", # (Transaction Manager Communication ) "NetworkDtcAccessInbound", # Allow Inbound (Transaction Manager Communication ) "NetworkDtcAccessOutbound" , # Allow Outbound (Transaction Manager Communication ) "XaTransactions", # Enable XA Transactions "LuTransactions" # Enable SNA LU 6.2 Transactions ) foreach($setting in $DTCSettings) { Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1 } Restart-Service msdtc 或不存在时将其重新添加。
我还尝试通过字符串操作来构造完整的句子,但最终没有解决,并且我不想为所有组合生成if结果语句,除非确实是唯一的希望,否则它将产生结果

很抱歉,我的帖子很长,但我想尽可能地做到透彻

2 个答案:

答案 0 :(得分: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"]

答案 1 :(得分:0)

我通常使用的标准模式是

filter = lambda x:选择=='全部'或选择== x