Filtering a data_editor and reflect the changes on the original

Hi everyone, I’ll try to explain briefly what I’m trying to achieve:
Basically I’m building a streamlit web app where the user has to upload a CSV file, then he will have the ability to choose if the entire CSV file or only the rows which come from the warning section should be displayed.
If he chooses to see the filtered data_editor he could edit some values so they should be reflected in the original data_editor which uploaded before.

with tab1: ## HOME
    
    df = st.file_uploader("Carica il file csv", type=['csv'], label_visibility="visible")

    if df is not None:
        file_name = df.name
        df = pd.read_csv(df)
        st.toast("File caricato con successo o già caricato", icon="✅")
    else:
        time.sleep(100000)
        st.error("ERRORE: Carica il file CSV")


    if 'toCheck' not in df.columns:
        df['toCheck'] = ''
    
    
    toggle_csv = st.toggle("Visualizza il CSV caricato",value=True)
    toggle_csv_errori = st.toggle("Visualizza solamente le righe relative agli eventuali warning nel CSV",value=False)
    
    if not toggle_csv_errori and not toggle_csv:
        st.info("Seleziona una modalità di visualizzazione del CSV caricato")
        time.sleep(100000)
 
    
    if toggle_csv:
        edited_df = st.data_editor(df,key="dataframe_iniziale", num_rows='dynamic',hide_index=False,column_order=('Stato materiale','Materiale','Descrizione materiale','Lead time Stock (MTS) WD','Lead Time Spedizione/Commerciale (MTO/ATO) WD','Lead time proposta','SS actual','Raggruppamento temporale SAP actual codice','Lotto minimo actual','Classe Forecast','Canale comm.Tab.Gest.Fibonacci','Tipo materiale','Div. actual','MRP actual','GS actual','Contr. Disponibilità','Gerarchia prodotti','Descr. Gerarchia','Nuova Gerarchia Prodotti','Descr. Nuova Gerarchia','Somma di Qta ordinato 03/2023','Somma di Qta ordinato 04/2023','Somma di Qta ordinato 05/2023','Somma di Qta ordinato 06/2023','Somma di Qta ordinato 07/2023','Somma di Qta ordinato 08/2023','Somma di Qta ordinato 09/2023','Somma di Qta ordinato 10/2023','Somma di Qta ordinato 11/2023','Somma di Qta ordinato 12/2023','Somma di Qta ordinato 01/2024','Somma di Qta ordinato 02/2024','Tipo approvvigionamento','Approvv. Speciale','Giacenza 0103/2023','Giacenza 0104/2023','Giacenza 0105/2023','Giacenza 0106/2023','Giacenza 0107/2023','Giacenza 0108/2023','Giacenza 0109/2023','Giacenza 0110/2023','Giacenza 0111/2023','Giacenza 0112/2023','Giacenza 0101/2024','Giacenza 0102/2024','Costo std unit.','E: Lead time produzione TPI','F: Lead time di acquisto TCP','SAC','SC','SCT','PAL','Val.arrot.','Data creazione','Marchiatura','T ciclo (sec)'), column_config={"Classe Forecast" : st.column_config.SelectboxColumn(width="medium", options=[
            "A - Materiali Generici",
            "B - Materiali Personalizzati",
            "C - Mat. non Gestiti a Stock"
            ]), "Canale comm.Tab.Gest.Fibonacci" : st.column_config.SelectboxColumn(width="medium", options=["EST Fil. Generico","EST No Fil. Generico","EST No Fil. Generico LT<20","EST No Fil. Pers Contr Baxi","EST No Fil. Personalizzato","ITA Listino generico","ITA Pers Contr Storm/Energy","ITA Pers Contr Storm/Energy"])})

        #### WARNING SECTION ####            
        try:
                edited_df['Stato materiale'] = edited_df['Stato materiale'].fillna('')
                stato_materiale_list = edited_df['Stato materiale'].to_list()
                indexes_stato_materiale = []
                if 'ZX' in stato_materiale_list:
                    for idx, val in enumerate(stato_materiale_list):
                        if val == 'ZX':
                            indexes_stato_materiale.append(idx)
                            edited_df.loc[idx, 'toCheck'] = 'TRUE'
                    if indexes_stato_materiale:
                        st.warning(f"WARNING: Stato materiale contiene stati 'ZX':  {indexes_stato_materiale}")
                    else:
                        pass
                else:
                    pass
        except Exception as e:
                print(e)
                

            # Coerenza Classe forecast e classe commerciale
        try:
                edited_df['Classe Forecast'] = edited_df['Classe Forecast'].fillna('')
                edited_df['Canale comm.Tab.Gest.Fibonacci'] = edited_df['Canale comm.Tab.Gest.Fibonacci'].fillna('')
                indexes_classe = []
                for idx, (i, j) in enumerate(zip(edited_df['Classe Forecast'], edited_df['Canale comm.Tab.Gest.Fibonacci'])):
                    if 'Generici' in i and ('generico' in j or 'Generico' in j):
                        pass
                    elif ('Personalizzati' in i or 'Mat. non Gestiti a Stock' in i) and ('Personalizzato' in j or 'Pers' in j):
                        pass
                    else:
                        indexes_classe.append(idx) 
                        edited_df.loc[idx, 'toCheck'] = 'TRUE'
                if indexes_classe:
                    st.warning(f"WARNING: Classe Forecast e Canale comm.Tab.Gest.Fibonacci non coerenti: {indexes_classe}")
        except Exception as e:
                print(e)
    
        if toggle_csv_errori:
            filtered_dataframe = edited_df[edited_df['toCheck'] == 'TRUE']
            st.data_editor(filtered_dataframe,key="filtered_df", num_rows='dynamic',hide_index=False,column_order=('Stato materiale','Materiale','Descrizione materiale','Lead time Stock (MTS) WD','Lead Time Spedizione/Commerciale (MTO/ATO) WD','Lead time proposta','SS actual','Raggruppamento temporale SAP actual codice','Lotto minimo actual','Classe Forecast','Canale comm.Tab.Gest.Fibonacci','Tipo materiale','Div. actual','MRP actual','GS actual','Contr. Disponibilità','Gerarchia prodotti','Descr. Gerarchia','Nuova Gerarchia Prodotti','Descr. Nuova Gerarchia','Somma di Qta ordinato 03/2023','Somma di Qta ordinato 04/2023','Somma di Qta ordinato 05/2023','Somma di Qta ordinato 06/2023','Somma di Qta ordinato 07/2023','Somma di Qta ordinato 08/2023','Somma di Qta ordinato 09/2023','Somma di Qta ordinato 10/2023','Somma di Qta ordinato 11/2023','Somma di Qta ordinato 12/2023','Somma di Qta ordinato 01/2024','Somma di Qta ordinato 02/2024','Tipo approvvigionamento','Approvv. Speciale','Giacenza 0103/2023','Giacenza 0104/2023','Giacenza 0105/2023','Giacenza 0106/2023','Giacenza 0107/2023','Giacenza 0108/2023','Giacenza 0109/2023','Giacenza 0110/2023','Giacenza 0111/2023','Giacenza 0112/2023','Giacenza 0101/2024','Giacenza 0102/2024','Costo std unit.','E: Lead time produzione TPI','F: Lead time di acquisto TCP','SAC','SC','SCT','PAL','Val.arrot.','Data creazione','Marchiatura','T ciclo (sec)'), column_config={"Classe Forecast" : st.column_config.SelectboxColumn(width="medium", options=[
            "A - Materiali Generici",
            "B - Materiali Personalizzati",
            "C - Mat. non Gestiti a Stock"
            ]), "Canale comm.Tab.Gest.Fibonacci" : st.column_config.SelectboxColumn(width="medium", options=["EST Fil. Generico","EST No Fil. Generico","EST No Fil. Generico LT<20","EST No Fil. Pers Contr Baxi","EST No Fil. Personalizzato","ITA Listino generico","ITA Pers Contr Storm/Energy","ITA Pers Contr Storm/Energy"])})
1 Like

@mathcatsand @Goyo I would really appreciate your help and sorry for tagging you guys

That doesn’t make much sense to me. The user didn’t ulpoad a data_editor.

Sorry, I don’t understand what you are trying to achieve and the code is too complex for my simple brain.

I suggest you to try with a simpler program, focused on the functionality that is causing you trouble.

Okay so I will try to explain better:
Through the file uploader, the user will upload a CSV file. Subsequently, using those two toggle boxes, the user can decide whether to display the entire CSV file or only the rows that meet the following conditions:

try:
                edited_df['Stato materiale'] = edited_df['Stato materiale'].fillna('')
                stato_materiale_list = edited_df['Stato materiale'].to_list()
                indexes_stato_materiale = []
                if 'ZX' in stato_materiale_list:
                    for idx, val in enumerate(stato_materiale_list):
                        if val == 'ZX':
                            indexes_stato_materiale.append(idx)
                            edited_df.loc[idx, 'toCheck'] = 'TRUE'
                    if indexes_stato_materiale:
                        st.warning(f"WARNING: Stato materiale contiene stati 'ZX':  {indexes_stato_materiale}")
                    else:
                        pass
                else:
                    pass
        except Exception as e:
                print(e)
                

            # Coerenza Classe forecast e classe commerciale
        try:
                edited_df['Classe Forecast'] = edited_df['Classe Forecast'].fillna('')
                edited_df['Canale comm.Tab.Gest.Fibonacci'] = edited_df['Canale comm.Tab.Gest.Fibonacci'].fillna('')
                indexes_classe = []
                for idx, (i, j) in enumerate(zip(edited_df['Classe Forecast'], edited_df['Canale comm.Tab.Gest.Fibonacci'])):
                    if 'Generici' in i and ('generico' in j or 'Generico' in j):
                        pass
                    elif ('Personalizzati' in i or 'Mat. non Gestiti a Stock' in i) and ('Personalizzato' in j or 'Pers' in j):
                        pass
                    else:
                        indexes_classe.append(idx) 
                        edited_df.loc[idx, 'toCheck'] = 'TRUE'
                if indexes_classe:
                    st.warning(f"WARNING: Classe Forecast e Canale comm.Tab.Gest.Fibonacci non coerenti: {indexes_classe}")
        except Exception as e:
                print(e)

If the user chooses to display the filtered data_editor based on these conditions by checking the second toggle box, then if they make modifications to it and later decide to display the entire CSV file, they will need to reflect the changes made previously.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.