简体   繁体   中英

How to filter dataframe based on user input using streamlit and python

I have a datafarme that includes 3 columns i want to allow the user to filter the result based on the user input where the user can select which column to filter using a checkbox.

The problem is that if the user doesn't check the 2 checkbox it return the below error:

df_result_search = df[df['age']==(age_search)]

NameError: name 'age_search' is not defined

and if the user check all the checkbox and enter the values it return a wrong record while it takes only one value and filter based on it.

code:


import streamlit as st 
import pandas as pd

data = {'name':['Tom', 'nick', 'krish', 'jack','Tom'],
        'nickname':['jack','krish','karim','joe','joe'],
        'age':[20, 18, 19, 18,22]}
 
df = pd.DataFrame(data)
df_result_search = pd.DataFrame() 


searchcheckbox_name_nickname = st.checkbox("Name or Nickname ",value = False,key=1)
searchcheckbox_age = st.checkbox("age",value = False,key=2)

if searchcheckbox_name_nickname:
    name_search = st.text_input("name")
    nickname_search = st.text_input("nickname")
if searchcheckbox_age:   
    age_search = st.number_input("age",min_value=0)
if st.button("search"):
    df_result_search = df[df['name'].str.contains(name_search,case=False, na=False)]
    df_result_search = df[df['nickname'].str.contains(nickname_search,case=False, na=False)]
    
    df_result_search = df[df['age']==(age_search)]
                    
    st.write("{} Records ".format(str(df_result_search.shape[0])))
    st.dataframe(df_result_search)

Code updated, in case 3 with pass # continue here. , you can continue writing the code when all checkboxes are checked.

Code

import streamlit as st 
import pandas as pd

data = {'name':['Tom', 'nick', 'krish', 'jack', 'Tom'],
        'nickname':['jack','krish','karim','joe', 'joe'],
        'age':[20, 18, 19, 18, 22]}
 
df = pd.DataFrame(data)
st.write(df)
df_result_search = pd.DataFrame() 


searchcheckbox_name_nickname = st.checkbox("Name or Nickname ",value = False,key=1)
searchcheckbox_age = st.checkbox("age",value = False,key=2)

if searchcheckbox_name_nickname:
    name_search = st.text_input("name")
    nickname_search = st.text_input("nickname")
else:
    name_search = ''
    nickname_search = ''

if searchcheckbox_age:   
    age_search = st.number_input("age",min_value=0)
else:
    age_search = 0

if st.button("search"):
    # 1. only name/nickname is checked
    if searchcheckbox_name_nickname and not searchcheckbox_age:
        # if name is specified but not the nickname
        if name_search != '' and nickname_search == '':
            df_result_search = df[df['name'].str.contains(name_search, case=False, na=False)]
        # if nickname is specified but not the name
        elif name_search == '' and nickname_search != '':
            df_result_search = df[df['nickname'].str.contains(nickname_search, case=False, na=False)]
        # if both name and nickname are specified
        elif name_search != '' and nickname_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 user does not enter anything
        else:
            st.warning('Please enter at least a name or a nickname')

    # 2. only age is checked
    elif not searchcheckbox_name_nickname and searchcheckbox_age:
        if age_search != 0:
            df_result_search = df[df['age'] == age_search]
            
    # 3. if both name/nickname and age are checked
    else:
        pass  # continue here.
                    
    st.write("{} Records ".format(str(df_result_search.shape[0])))
    st.dataframe(df_result_search)

Sample output

The user only use the name checkbox and only fillup the name.

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM