我有一個 python 腳本,它使用多個 if statement條件以允許用戶過濾資料框并回傳所需的結果。
問題是我有多個條件使腳本非常慢。
我的問題是如何洗掉或減少多余的 if 條件,并根據用戶對他想要過濾的列的選擇使條件動態化。
代碼:
col1_ch,col2_ch,col3_ch = st.sidebar.columns(3)
with col1_ch:
adv_searchcheckbox_name_nickname = st.checkbox("Name or Nickname or Mother name",value = False,key=1)
adv_searchcheckbox_gender = st.checkbox("Gender",value = False,key=2)
adv_searchcheckbox_status_type = st.checkbox("Status type",value = False,key=3)
adv_searchcheckbox_country = st.checkbox("Country",value = False,key=4)
adv_searchcheckbox_bd = st.checkbox("Date Of Birth",value = False,key=5)
if adv_searchcheckbox_name_nickname:
col1, col2,col3 = st.sidebar.columns(3)
with col1:
name_search = st.text_input("name")
with col2:
nickname_search = st.text_input("nickname")
with col3:
Mother_name_search = st.text_input("mother name")
if adv_searchcheckbox_gender:
radio_gender = st.sidebar.radio(label="Gender", options=["M","F"])
if st.sidebar.button("search"):
# *******************name nickname mothername checkbox***************
# . only name/nickname/mother name is checked
if adv_searchcheckbox_name_nickname and not adv_searchcheckbox_gender and not adv_searchcheckbox_status_type and not adv_searchcheckbox_country and not adv_searchcheckbox_bd:
# if name is specified but not the nickname and mother name
if name_search != '' and nickname_search == '' and Mother_name_search =='':
df_result_search = df[df['name'].str.contains(name_search, case=False, na=False)]
# if nickname is specified but not the name and mother name
elif nickname_search != ''and name_search == '' and Mother_name_search == '':
df_result_search = df[df['nickname'].str.contains(nickname_search, case=False, na=False)]
# if mother name is specified but not the name and nickname
elif Mother_name_search != '' and name_search == '' and nickname_search == '':
df_result_search = df[df['mother_name'].str.contains(Mother_name_search, case=False, na=False)]
# if both name and nickname are specified
elif name_search != '' and nickname_search != '' and Mother_name_search!='':
df_result_search = df[(df['name'].str.contains(name_search, case=False, na=False)) & (df['nickname'].str.contains(nickname_search, case=False, na=False))]
# if both name and mother_name are specified
elif name_search != '' and Mother_name_search!='' and nickname_search == '' :
df_result_search = df[(df['name'].str.contains(name_search, case=False, na=False)) & df['mother_name'].str.contains(Mother_name_search, case=False, na=False)]
# if both nickname and mother_name are specified
elif nickname_search != '' and Mother_name_search!='' and name_search == '':
df_result_search = df[(df['nickname'].str.contains(nickname_search, case=False, na=False)) & df['mother_name'].str.contains(Mother_name_search, case=False, na=False)]
# if user does not enter anything
else:
st.warning('Please enter at least a name or a nickname or mother name ')
# *******************name nickname mothername checkbox***************
# *******************gender checkbox***************
elif adv_searchcheckbox_gender and adv_searchcheckbox_name_nickname and not adv_searchcheckbox_status_type and not adv_searchcheckbox_country and not adv_searchcheckbox_bd:
# if name is specified but not the nickname and mother name
if name_search != '' and radio_gender !='' and nickname_search == '' and Mother_name_search =='':
df_result_search = df[df['name'].str.contains(name_search, case=False, na=False) & (df['gender'] ==(radio_gender))]
# if nickname is specified but not the name and mother name
elif nickname_search != '' and radio_gender !=''and name_search == '' and Mother_name_search == '':
df_result_search = df[df['nickname'].str.contains(nickname_search, case=False, na=False)& (df['gender'] ==(radio_gender))]
# if mother name is specified but not the name and nickname
elif Mother_name_search != '' and radio_gender !='' and name_search == '' and nickname_search == '' :
df_result_search = df[df['mother_name'].str.contains(Mother_name_search, case=False, na=False)& (df['gender'] ==(radio_gender))]
# if both name and nickname are specified
elif name_search != '' and nickname_search != '' and radio_gender !=''and Mother_name_search=='':
df_result_search = df[(df['name'].str.contains(name_search, case=False, na=False)) & (df['nickname'].str.contains(nickname_search, case=False, na=False)) & (df['gender'] ==(radio_gender))]
# if both name and mother name are specified
elif name_search != '' and radio_gender !=''and Mother_name_search!='' and nickname_search == '':
df_result_search = df[(df['name'].str.contains(name_search, case=False, na=False)) & (df['mother_name'].str.contains(Mother_name_search, case=False, na=False)) & (df['gender'] ==(radio_gender))]
# if both nickname and mother name are specified
elif nickname_search != '' and radio_gender !=''and Mother_name_search!='' and name_search == '':
df_result_search = df[(df['nickname'].str.contains(nickname_search, case=False, na=False)) & (df['mother_name'].str.contains(name_search, case=False, na=False)) & (df['gender'] ==(radio_gender))]
# if all name nickname and mother name are specified
elif nickname_search != '' and radio_gender !=''and Mother_name_search!='' and name_search != '':
df_result_search = df[(df['name'].str.contains(name_search, case=False, na=False)) & (df['nickname'].str.contains(nickname_search, case=False, na=False)) & (df['mother_name'].str.contains(name_search, case=False, na=False)) & (df['gender'] ==(radio_gender))]
# if user does not enter anything
else:
st.warning('Specify at least 1 input ')
# *******************gender checkbox***************
st.dataframe(df_result_search)
這僅適用于前 2 列
uj5u.com熱心網友回復:
您應該逐步過濾它。result在每個步驟中,您只需應用一個條件即可縮小最終資料幀(存盤到變數)的范圍。
result = df # initialize the result and narrow-down the result in each of the following conditions
if name_search: # note: do not use name_search != ''
result = result[result['name'].str.contains(name_search, case=False, na=False)]
if nickname_search:
result = result[result['nickname'].str.contains(nickname_search, case=False, na=False)]
if mother_name_search:
result = result[result['mother_name'].str.contains(mother_name_search, case=False, na=False)]
# ... etc. add more conditions as you need
我想你現在明白了。
uj5u.com熱心網友回復:
對于Python 3.10中的新模式匹配功能,這可能是一個很好的用例。
除此之外,您在 is/elif 陳述句中一遍又一遍地使用相同的變數(例如,、、nickname_search... name_search)。
您可以使用以下內容預先定義他們的內容:
name_search_empty = ''
這樣你至少可以避免多余的比較運算子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491758.html
上一篇:雖然,不在Python中回圈
