2015-06-17 18 views
5

Sto avendo questo tipo di file CSV:panda pitone read_csv delimitatore nei dati delle colonne

12012;My Name is Mike. What is your's?;3;0 
1522;In my opinion: It's cool; or at least not bad;4;0 
21427;Hello. I like this feature!;5;1 

voglio ottenere questi dati in da pandas.DataFrame. Ma read_csv(sep=";") genera eccezioni dovute al punto e virgola nella colonna del messaggio generato dall'utente nella riga 2 (secondo me: è bello, o almeno non è male). Tutte le colonne rimanenti hanno costantemente caratteri numerici.

Qual è il metodo più conveniente per gestirlo?

+0

Puoi spiegare di più sul tuo problema? qual è il tuo output atteso? – Kasramvd

+0

la mia intenzione è di analizzare questi dati csv in un DataFrame. Ma genera un'eccezione perché c'è un punto e virgola in una colonna e il panda pensa di doverlo dividere in due colonne. –

+1

Chi sta generando questi file ambigui e c'è un modo per spostare cielo e terra per renderli sani di mente? –

risposta

5

Gestire i delimitatori non quotati è sempre una seccatura. In questo caso, poiché sembra che il testo spezzato sia circondato da tre colonne correttamente codificate, possiamo recuperare. TBH, mi basta usare il lettore standard di Python e costruire un dataframe volta da che:

import csv 
import pandas as pd 

with open("semi.dat", "r", newline="") as fp: 
    reader = csv.reader(fp, delimiter=";") 
    rows = [x[:1] + [';'.join(x[1:-2])] + x[-2:] for x in reader] 
    df = pd.DataFrame(rows) 

che produce

 0            1 2 3 
0 12012    My Name is Mike. What is your's? 3 0 
1 1522 In my opinion: It's cool; or at least not bad 4 0 
2 21427     Hello. I like this feature! 5 1 

Poi possiamo immediatamente salvarlo e ottenere qualcosa citato correttamente:

In [67]: df.to_csv("fixedsemi.dat", sep=";", header=None, index=False) 

In [68]: more fixedsemi.dat 
12012;My Name is Mike. What is your's?;3;0 
1522;"In my opinion: It's cool; or at least not bad";4;0 
21427;Hello. I like this feature!;5;1 

In [69]: df2 = pd.read_csv("fixedsemi.dat", sep=";", header=None) 

In [70]: df2 
Out[70]: 
     0            1 2 3 
0 12012    My Name is Mike. What is your's? 3 0 
1 1522 In my opinion: It's cool; or at least not bad 4 0 
2 21427     Hello. I like this feature! 5 1 
+0

Funziona bene. Questa è una buona soluzione. Grazie! Ad ogni modo, c'è un modo per agganciarsi al parser dei panda e fare lo splitting e l'unione di roba "al volo"? –