根据用户输入的不同条件过滤 pandas
Filtering pandas based on varying conditions as inputs form the user
我正在尝试根据用户的输入过滤 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
如果所有名称 returns 和 "All"
,即用户加载了页面,这是一个非常简单的 if 语句,我只显示完整的 DF 但是,如果我开始 select 要从菜单中过滤的值,而其他菜单仍处于“全部”状态,或者我想在 selected 后将其中一个更改为 "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 语句用于所有会产生结果的组合,除非它真的是唯一的希望
抱歉拖了这么久 post,但我试图尽可能彻底
你能试试这个吗?在这里,我假设文本 All
保留用于 select 所有行。
我正在做的是首先检查 selected 输入是否在唯一列表中,如果不是,则通过创建 True
布尔值我 select 所有行。
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"]
我通常使用的标准模式类似于
filter = lambda x: 选择 == 'All' 或选择 == x
我正在尝试根据用户的输入过滤 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
如果所有名称 returns 和 "All"
,即用户加载了页面,这是一个非常简单的 if 语句,我只显示完整的 DF 但是,如果我开始 select 要从菜单中过滤的值,而其他菜单仍处于“全部”状态,或者我想在 selected 后将其中一个更改为 "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 语句用于所有会产生结果的组合,除非它真的是唯一的希望
抱歉拖了这么久 post,但我试图尽可能彻底
你能试试这个吗?在这里,我假设文本 All
保留用于 select 所有行。
我正在做的是首先检查 selected 输入是否在唯一列表中,如果不是,则通过创建 True
布尔值我 select 所有行。
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"]
我通常使用的标准模式类似于
filter = lambda x: 选择 == 'All' 或选择 == x