Forum
>>
Principianti
>>
Split di campi con dati multipli su più record
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da Silvio0908 |
2023-07-12 16:07:24 - Split di campi con dati multipli su più record
|
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 --- |
|
Scritto da nuzzopippo |
2023-07-14 11:06:38 - Re: Split di campi con dati multipli su più record
|
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 datiI 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 NaNcome 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 NaNPer 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... |
|
Scritto da Silvio0908 |
2023-07-14 12:18:50 - Re: Split di campi con dati multipli su più record
|
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.