Forum >> Principianti >> Split di campi con dati multipli su più record

Pagina: 1

Salve,

sono nuovo sia sul forum e sia per quanto riguarda la programmazione in python.

Spiego subito qual è i mio problema. Avrei intenzione di confrontare dei codici articolo presenti in un dataframe con una serie di codici presenti in un altro dataframe e vorrei che i dati corrispondenti al codice articolo presenti in altre colonne popolassero un terzo dataframe con i dati che mi interessano.

Riesco a farlo, bene o male, ma ho il problema che un codice articolo corrispondente a più record mi viene riporatato con dati multipli all'interno dei campi. Mi spiego meglio con delle immagini:

l'immagine1 è la lista dei codici da cercare, l'immagine2 è il dataframe in cui cercare e l'immagine3 e 4 sono quanto risultante.

Vorrei che i record con datimultipli all'interno fossero splittati su record singoli riproponendo il codice articolo iniziale.

potete aiutarmi?

Grazie in anticipo.



import pandas as pd

from openpyxl import Workbook


df_anagraficaID = pd.read_csv('anagrafica.csv')

df_chip = pd.read_csv('elencochip_test.csv')


columns = ['Barcode', 'STATO', 'AZIENDA', 'AttivitaUltimaEntrata', 'DataUltimaEntrata', 'AttivitaUltimaUscita', 'DataUltimaUscita']

df_def = pd.DataFrame(columns=columns)


lun1 = str(len(df_chip))

lun2 = str(len(df_anagraficaID))

for index, row in df_chip.iterrows():

barcode1 = str(row['codice'])

df4=df_anagraficaID[df_anagraficaID['Barcode'] == barcode1]

list = [barcode1, str(df4['CodStato'].values), str(df4['CODAZ'].values), str(df4['AttivitaUltimaEntrata'].values), str(df4['DATAULTIMAENTRATA'].values), str(df4['AttivitaUltimaUscita'].values), str(df4['DATAULTIMAUSCITA'].values)]

df_def.loc[len(df_def)] = list






--- Ultima modifica di Silvio0908 in data 2023-07-12 16:10:46 ---

--- Ultima modifica di Silvio0908 in data 2023-07-12 16:12:55 ---
Allegati
Ciao Silvio, non ho potuto risponderti ieri perché trovavo il forum off-line




Intanto, dato che sei nuovo, alcuni consigli : NON allegare immagini per fornire esempi di csv ma fornisci direttamente il testo del csv, è piuttosto seccante andarsi a scriversi a mano i dati per poterTi mostrare un esempio, inoltre, utilizza il tasto codice ("<>") per raccogliere il Tuo codice.

Ho voluto, comunque, provare a farTi un esempio creando manualmente in una sessio IDLE i dataset dei Tuoi dati, chiamando "df_c" il dataset dei barcode e "df_d" quello dei dati

Python 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
import pandas as pd
data = '''AA123456000;Mod_1;21;A;stato_1;ROMA;ROMA;ROMA;ROMA;2023-05-01 00:00:00;A001;2023-06-11 00:00:00;A011
AA123456790;Mod_2;1;B;stato_2;NAPOLI;NAPOLI;NAPOLI;NAPOLI;2023-05-02 00:00:00;A002;2023-06-12 00:00:00;A012
AA123456000;Mod_1;1;C;stato_3;FIRENZE;FIRENZE;FIRENZE;FIRENZE;2023-05-03 00:00:00;A003;2023-06-13 00:00:00;A013
AA123456000;Mod_1;1;D;stato_4;AREZZO;AREZZO;AREZZO;AREZZO;2023-05-04 00:00:00;A004;2023-06-14 00:00:00;A014
AA123456793;Mod_4;3;E;stato_5;TORINO;TORINO;TORINO;TORINO;2023-05-05 00:00:00;A005;2023-06-15 00:00:00;A015'''
codecs = '''AA123456000
AA123456790
AA123456793
AA123456788
AA12345679311
AA123456
AA123456658'''
codec_list = codecs.split('\n')
data_list = [x.split(';') for x in data.split('\n')]
# creo dataset analoghi a quelli che si produrrebbero dai csv
df_c = pd.DataFrame(codec_list, columns=['Barcode',])
# definisco le colonne dati come "dovrebbero" scaturire dai csv
cols = ['Barcode', 'Modello', 'NumLavaggi', 'CodStato', 'desStatusLavorazione', 'CODAZ', 'Azienda', 'Stabilimento', 'CITTA', 'DATAULTIMAENTRATA', 'AttivitaUltimaEntrata', 'DATAULTIMAUSCITA', 'AttivitaUltimaUscita']
df_d = pd.DataFrame(data_list, columns=cols)  # dataset dei dati
I due dataset dovrebbero essere simili a quelli che ottieni Tu dai csv, non li ho stampati ma prova a farlo Tu, qui viene un ulteriore consiglio : vedi di uniformare per quanto possibile i nomi e le posizioni delle colonne tra i dati sorgenti ed il risultato da ottenere, in modo da non doversi complicare la vita, se fossero uniformi, la selezione voluta sarebbe semplicissima da ottenere tramite le funzioni merge e drop dei dataset, Te lo mostro continuando

# CREZIONE STRUMENTI PER SELEZIONE DEI DATI
# le colonne da "conservare" devono essere uguali ai nomi sorgeti, almeno nei caratteri
columns = ['Barcode', 'codSTATO', 'AZIENDA', 'AttivitaUltimaEntrata', 'DataUltimaEntrata', 'AttivitaUltimaUscita', 'DataUltimaUscita']
col_drop = [x for x in cols if not x.lower() in ' '.join(columns).lower()]
# estraggo i dati intressanti
df_sel = df_c.merge(df_d, on='Barcode', how='left').drop(columns=col_drop)
pd.set_option('display.max_columns', None)  # permetto la stampa di tutte le colonne
print(df_sel)
         Barcode CodStato  Azienda    DATAULTIMAENTRATA AttivitaUltimaEntrata  \
0    AA123456000        A     ROMA  2023-05-01 00:00:00                  A001   
1    AA123456000        C  FIRENZE  2023-05-03 00:00:00                  A003   
2    AA123456000        D   AREZZO  2023-05-04 00:00:00                  A004   
3    AA123456790        B   NAPOLI  2023-05-02 00:00:00                  A002   
4    AA123456793        E   TORINO  2023-05-05 00:00:00                  A005   
5    AA123456788      NaN      NaN                  NaN                   NaN   
6  AA12345679311      NaN      NaN                  NaN                   NaN   
7       AA123456      NaN      NaN                  NaN                   NaN   
8    AA123456658      NaN      NaN                  NaN                   NaN   

      DATAULTIMAUSCITA AttivitaUltimaUscita  
0  2023-06-11 00:00:00                 A011  
1  2023-06-13 00:00:00                 A013  
2  2023-06-14 00:00:00                 A014  
3  2023-06-12 00:00:00                 A012  
4  2023-06-15 00:00:00                 A015  
5                  NaN                  NaN  
6                  NaN                  NaN  
7                  NaN                  NaN  
8                  NaN                  NaN  

come puoi vedere, il risultato ottenuto è "quasi" quello che volevi Tu, se origini e prodotto finale fossero stati conformi la elaborazione poteva finire qui, è comunque possibile modificare i nomi delle colonne con la funzione rename e poi riordinare, lo realiziamo proseguendo

# nomi ed ordinamento colonne sono quelli originali, cerco di rimappare i nomi
col_names = df_sel.columns.values.tolist()
for c in col_names:
    for j in range(len(columns)):
        if c.lower() == columnsj.lower():
            col_mapc = columnsj
            break

        
df_ren = df_sel.rename(columns=col_map)
df_ren.columns.values
array(['Barcode', 'codSTATO', 'AZIENDA', 'DataUltimaEntrata',
       'AttivitaUltimaEntrata', 'DataUltimaUscita',
       'AttivitaUltimaUscita'], dtype=object)
df_ren2 = df_ren.rename({'codSTATO': 'STATO',}, axis='columns')
                         
df_ren2.columns.values
                         
array(['Barcode', 'STATO', 'AZIENDA', 'DataUltimaEntrata',
       'AttivitaUltimaEntrata', 'DataUltimaUscita',
       'AttivitaUltimaUscita'], dtype=object)
columns1 = 'STATO'
                         
df_fin = df_ren2columns
                         
df_fin.columns.values
                         
array(['Barcode', 'STATO', 'AZIENDA', 'AttivitaUltimaEntrata',
       'DataUltimaEntrata', 'AttivitaUltimaUscita', 'DataUltimaUscita'],
      dtype=object)
print(df_fin)
                         
         Barcode STATO  AZIENDA AttivitaUltimaEntrata    DataUltimaEntrata  \
0    AA123456000     A     ROMA                  A001  2023-05-01 00:00:00   
1    AA123456000     C  FIRENZE                  A003  2023-05-03 00:00:00   
2    AA123456000     D   AREZZO                  A004  2023-05-04 00:00:00   
3    AA123456790     B   NAPOLI                  A002  2023-05-02 00:00:00   
4    AA123456793     E   TORINO                  A005  2023-05-05 00:00:00   
5    AA123456788   NaN      NaN                   NaN                  NaN   
6  AA12345679311   NaN      NaN                   NaN                  NaN   
7       AA123456   NaN      NaN                   NaN                  NaN   
8    AA123456658   NaN      NaN                   NaN                  NaN   

  AttivitaUltimaUscita     DataUltimaUscita  
0                 A011  2023-06-11 00:00:00  
1                 A013  2023-06-13 00:00:00  
2                 A014  2023-06-14 00:00:00  
3                 A012  2023-06-12 00:00:00  
4                 A015  2023-06-15 00:00:00  
5                  NaN                  NaN  
6                  NaN                  NaN  
7                  NaN                  NaN  
8                  NaN                  NaN  

Per dettagli, leggi e facci prove su, la documentazione che Ti ho messo in link, pandas offre molti potenti strumenti, comprendendoli e preparando opportunamente i dati (prevenire e meglio che curare) può facilitare le Tue operazioni

Fatti non foste a viver come bruti...
Salve, innanzitutto mi scuso per per le imprecisioni della mia richiesta e poi ringrazio per la risposta. E' stata esaustiva e ho già capito come fare anche se consulterò il link proposto e farò delle prove per approfondire il discorso.
Grazie ancora ;)


Pagina: 1



Esegui il login per scrivere una risposta.