2015-06-17 13 views
5

ich diese Art von CSV-Datei habe:Python Pandas read_csv Trennzeichen in der Spalte Daten

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 

Ich möchte diese Daten in da pandas.DataFrame zu bekommen. Aber read_csv(sep=";") löst Ausnahmen aufgrund des Semikolons in der benutzerdefinierten Spalte Spalte in Zeile 2 (meiner Meinung nach: Es ist cool, oder zumindest nicht schlecht). Alle übrigen Spalten haben fortlaufend numerische dtypes.

Was ist die bequemste Methode, um dies zu verwalten?

+0

Können Sie mehr über Ihr Problem erklären? Was ist deine erwartete Ausgabe? – Kasramvd

+0

meine Absicht ist es, diese CSV-Daten in einen DataFrame zu analysieren. Aber es gibt eine Ausnahme aus, weil in einer Spalte ein Semikolon steht und Pandas denkt, dass es in zwei Spalten aufgeteilt werden sollte. –

+1

Wer erzeugt diese mehrdeutigen Dateien und gibt es irgendeine Möglichkeit, Himmel und Erde zu bewegen, um sie gesund zu bekommen? –

Antwort

5

Der Umgang mit nicht angegebenen Trennzeichen ist immer ein Ärgernis. Da in diesem Fall bekannt ist, dass der beschädigte Text von drei korrekt codierten Spalten umgeben ist, können wir ihn wiederherstellen. TBH, würde ich benutzen Sie einfach den Standard-Python-Leser und einen Datenrahmen bauen einmal von diesem:

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) 

die

 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 

Dann erzeugt wir sie sofort speichern und richtig etwas zitiert erhalten:

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

Funktioniert gut. Dies ist ein guter Workaround. Vielen Dank! Wie auch immer, gibt es eine Möglichkeit, in den Pandas-Parser einzuhaken und das Teilen und Zusammenfügen "on the fly" zu machen? –

Verwandte Themen