Topic: iniziare a leggere un dataframe da uno specifico tag  (Letto 234 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Claudia

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
iniziare a leggere un dataframe da uno specifico tag
« il: Febbraio 04, 2019, 16:45 »
Ciao a tutti!
sono da poco nel fantastico mondo della programmazione in py e non riesco a risolvere questo problema :

devo lanciare un ciclo un cui ho alcuni file csv che devo importare come dataFrame in python.  Nei csv la parte di file di mio interesse inizia con una riga che contiene  la stringa ' Data'  ma purtroppo  questa riga è in una posizione diversa a seconda del file csv  :( (......non posso assegnare un header perche cabia di volta in volta)
sapete come posso fare per importare i file? 

Grazie mille per l'aiuto  :)

Offline nuzzopippo

  • python unicellularis
  • *
  • Post: 38
  • Punti reputazione: 0
    • Mostra profilo
Re:iniziare a leggere un dataframe da uno specifico tag
« Risposta #1 il: Febbraio 05, 2019, 16:12 »
Ciao @Claudia.

È da ieri che osservo questo post e non vedo risposte. Non me ne stupisce, data la domanda sin troppo vaga e che puo dar origine a numerose varianti sul tema ... in sostanza contrasta pienamente con le linee guida di questo forum, che Ti invito a leggere, come sono stato invitato a fare a mia volta.

Perdonabile svista, per un primo post.
Dato che nessuno degli utenti esperti si è sin ora espresso, provero io a dare qualche indicazione, pur essendo uno degli ultimi "acquisti" e, credo, uno dei più scarsi componenti del forum.

Andiamo sulla Tua domanda :
Citazione
Nei csv la parte di file di mio interesse inizia con una riga che contiene  la stringa ' Data'  ma purtroppo  questa riga è in una posizione diversa a seconda del file csv

Premetto che in python, nella libreria base, è presente la libreria "csv" che certamente può esserti utile ma che personalmente snobbo un po', preferendo la libertà di trattare direttamente con testo e liste, nel caso da Te posto, leggere i dati a partire da un particolare contenuto, ti faccio un semplice esempio; posto un file "nomi.csv ", con questo contenuto :

COGNOME;NOME;DATA_NASCITA
De Paperoni;Paperon;1901-01-01
Paperino;Paolino;1950-11-01
Paperone;Gastone;1950-01-06
 Data;;
Mouse;Miky;1900-02-29
Mouse;Minnie;1910-01-01
Mucca;Clarabella;1923-12-13


per leggere solo i dati successivi al ' Data', farei così:

>>> f = open('nomi.csv', 'r')
>>> elenco = f.read().splitlines()
>>> f.close()
>>> attivo = False
>>> dati = []
>>> for riga in elenco:
riga_dati = riga.split(';')
if ' Data' in riga_dati:
attivo = True
continue
if attivo:
dati.append(riga_dati)


>>> dati
[['Mouse', 'Miky', '1900-02-29'], ['Mouse', 'Minnie', '1910-01-01'], ['Mucca', 'Clarabella', '1923-12-13']]
>>>

ed utilizzerei la lista di liste "dati" per le successive operazioni.

Va da se che un eventuale ciclo tra vari files "csv" lo farei estraendo, a sua volta, l'elenco dei files da una directory che li contiene, il modulo blob è comodo per tal fine:
>>> import glob
>>> lista_csv = glob.glob('my_tmp/test/pyt/prove/*.csv')
>>> lista_csv
['my_tmp/test/pyt/prove/indirizzi.csv', 'my_tmp/test/pyt/prove/nomi.csv']
>>>


Ora veniamo al punto cruciale
Citazione
file csv che devo importare come dataFrame in python.
Cosa intendi per "Data-frame"? ,,, a quanto ne so, un data-frame dovrebbe essere una struttura per rappresentare un insieme di dati di varia natura ,,, per tale rappresentazione, in python, si prestano bene tanto le liste dell'esempio prima quanto le tuple ... dizionari ed insiemi magari anche, per usi un po' più particolari.

Ora, la circostanza che hai scritto il post nella sezione "database" fa sorgere l'ipotesi Tu possa magari volere qualcosa d'altro, tipo importare dati in un database, converrebbe chiarissi questo punto (si possono importare direttamente i csv in molti db), assieme a quali sono le Tue effettive difficoltà e le caratteristiche presenti nei csv che devi trattare, la variabilità da Te indicata è tutt'altro che comune e per poter fare qualcosa di utile bisogna sapere le condizioni di partenza e quelle da ottenersi all'arriv.

Ciao

[Edit] Sono andato a fare una ricerca "data frame in python", ed ho trovato "Python Pandas - DataFrame" ... che non sarebbe altro che una rappresentazione dati per righe e colonne ... ah beh, se serve ...
È ciò che cerchi?
« Ultima modifica: Febbraio 05, 2019, 16:46 da nuzzopippo »

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:iniziare a leggere un dataframe da uno specifico tag
« Risposta #2 il: Febbraio 05, 2019, 22:41 »
Si, credo che intenda quello. Python ha molta trazione nella community data-science e li numpy e pandas sono standard.
Ora, verrebbe da dire che questo non c'entra molto con database e quindi lo spostero' nella sezione opportuna.

Ora Pandas ha un sacco di  giocattolini per leggere csv in modo automatico (no, se i vostri CSV sono tipo roba business, usate il modulo csv che fa quello che deve e non tira in ballo pandas, che e' una dipendenza onerosa con profonde radici nel calcolo scientifico numerico -- fortran anyone?).
Diciamo cosi': se il vostro collega bravo ma che non sa python e non programma davvero userebbe excel, csv. Se userebbe R o Matlab, pandass.

Ora il problema di OP e' che evidentemente i suoi CSV sono stati generati in modo sadico per creare dolore a chi li deve leggere. Perche' ovviamente il modo comodo per usare csv e' quando sono, di fatto dei tabelloni piatti e compatti.

Ora OP fornisce pochi dettagli su cosa ci sia nella parte che le interessa, ma la soluzione standard per questo tipo di problemi e' spezzare in due. Da un lato ci sara' la questione di tirare fuori i dati utili "in qualche modo" e fondamentalmente tirare fuori il pezzo di file che interessa (si, grosso modo proprio come testo). Dall'altra parte si ha il coso che prende questo testo un po' piu' disciplinato e lo parsa con una soluzione standard.

Offline Claudia

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:iniziare a leggere un dataframe da uno specifico tag
« Risposta #3 il: Febbraio 08, 2019, 10:15 »
Ciao @nuzzopippo,
prima di tutto volevo ringraziarti per la risposta, nonostante la mia domanda fosse posta in modo non conforme alle linee guida del forum. Mi scuso di ciò, ho letto le linee guida che terrò ben presente per il futuro ( e di sicuro molto vicino) quesito da sottoporre  :).

Un secondo grazie è doveroso anche per la risposta! ho provato per come mi hai suggerito e sono riuscita a leggere il csv   :).
Ora sto provando a leggere salvare in dati = [] anche la riga che contiene la stringa "data". Ho aggiunto una istruzione alla prima condizione del codice :

#codice
f = open('C:\Anaconda3\TV20_F.txt', 'r')
elenco = f.read().splitlines()
f.close()
attivo = False
dati = []
for riga in elenco:
   riga_dati = riga.split(',')
   if 'Data' in riga_dati:
       attivo = True, dati.append(riga_dati)
            continue
        if attivo:
             dati.append(riga_dati)

ma mi compare il seguente errore :
if attivo:
IndentationError: unindent does not match any outer indentation level

Secondo te a cosa potrebbe essere dovuto :confused:?

p.s. ho provato a postare il codice con il "bottone con l'icona di un cancelletto ( )"  ma non lo vedo tra i bottoni disponibili  :confused: :confused: :confused: :(;

Ciao anche a @riko,
mi scuso per aver sbagliato sezione....si purtroppo le analisi che devono condurre sono su file csv che mi sono sembrati sono stati un vero castigo! (ancora di più perché sono alle prime armi!!!) .
« Ultima modifica: Febbraio 08, 2019, 10:19 da Claudia »

Offline nuzzopippo

  • python unicellularis
  • *
  • Post: 38
  • Punti reputazione: 0
    • Mostra profilo
Re:iniziare a leggere un dataframe da uno specifico tag
« Risposta #4 il: Febbraio 08, 2019, 10:42 »
if attivo:
IndentationError: unindent does not match any outer indentation level

lo dice l'errore stesso : è dovuto ad errata indentazione.

Python ha una caratteristica peculiare di gestire l'annidamento del codice : utilizza l'indentazione.
Ne consegue, nel codice da Te esposto, che il "continue" invoca un blocco di indentazione che non è stato definito. Dovresti de-indentare di un livello tanto quel continue quanto il blocco "if attivo" e codice seguente, così com'è non dovrebbe funzionare correttamente. Fai molta attenzione alle indentazioni.

Un suggerimento per futuri post : crea un blocco per il codice premendo il pulsante "pythoncode" nella bottoniera ed inserisci il codice tra i tag che vengono generati, sarà molto più chiaro da leggere ed ordinato.

buon lavoro :)

[Edit] Concentrato sull'errore non me ne ero reso conto di :
Citazione
Ora sto provando a leggere salvare in dati = [] anche la riga che contiene la stringa "data".
Così funziona, certo ma ... ripristina com'era e prova ad eliminare proprio il "continue" dal codice, vedi quindi che succede ... Ti servirà ;)
« Ultima modifica: Febbraio 08, 2019, 11:16 da nuzzopippo »

Offline Claudia

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:iniziare a leggere un dataframe da uno specifico tag
« Risposta #5 il: Febbraio 08, 2019, 12:41 »
@nuzzopippo
grazie mille! sono riuscita sistemare l'indentazione ed il codice gira, ora provo anche  ad eliminare il "continue" dal codice per vedere cosa succede cosi come suggerisci :)

grazie anche per avermi spiegato come postare il codice! :) :) :) :)

Offline caronte

  • python erectus
  • ***
  • Post: 221
  • Punti reputazione: 0
    • Mostra profilo
Re:iniziare a leggere un dataframe da uno specifico tag
« Risposta #6 il: Febbraio 08, 2019, 21:02 »
Ciao
Perdonami ma non e’ che si capisce bene cosa realmente vorresti fare e soprattutto con cosa..
Cioe’ dici di dover lavorare su dataframes ma non dici come sono organizzati i dati…
Si presume che sto df abbia diverse colonne, visto che non puoi specificare all’inizio quale header contenga la stringa ‘Data’, poi non si capisce bene se tale stringa sia parte di un testo e se tale testo rappresenti uno dei valori di una colonna in particolare…probabilmente si, e quindi dovresti filtrare solo i tutti i valori  di indice i della suddetta colonna  j = 2 ad es. ma poi dal codice che posti estrai righe “intere” diciamo, da un file di testo che non e’ un csv….

poi, permettimi ancora, se qualcuno spera che individui piu esperti spendano piu di 2 secondi per interpretare i ‘sentimenti’ di chi chiede un aiuto, senza che costui si sprechi a fornire un esempio riproducibile ( nello specifico del problema che si ha anche in piccolo chiaramente), e a fornire dei dati in maniera chiara…be tanti auguri…

poi: Quel codice e’ inefficiente e lo diventa ancor di piu se cominci ad aver a  che fare con un bel po di dati ;

se vuoi fare data analisi in Python non puoi prescindere da dataframes, series e tensori in generale, che oltre ad essere l’unica roba che i vari “modelli statistici e predittivi capiscono”…sono le uniche ‘strutture’ che ti consentono una manipolazione pesante dei suddetti