2015-06-17 27 views
5

mam ten typ pliku CSV:pandy python read_csv separator danych w kolumnie

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 

chcę uzyskać te dane do da pandas.DataFrame. Ale read_csv(sep=";") zgłasza wyjątki ze względu na średnik w kolumnie generowanej przez użytkownika w wierszu 2 (Moim zdaniem: Jest fajny lub przynajmniej niezły). Wszystkie pozostałe kolumny mają stale numeryczne dtypes.

Jaka jest najwygodniejsza metoda zarządzania tym?

+0

Czy możesz wyjaśnić więcej o swoim problemie? jaki jest twój oczekiwany wynik? – Kasramvd

+0

moim zamiarem jest przetwarzanie danych csv w DataFrame. Ale generuje wyjątek, ponieważ w jednej kolumnie jest średnik, a panda uważa, że ​​powinna podzielić go na dwie kolumny. –

+1

Kto generuje te niejednoznaczne pliki i czy istnieje jakiś sposób na przeniesienie nieba i ziemi, aby uzyskać ich przy zdrowych zmysłach? –

Odpowiedz

5

Radzenie sobie z niecytowanymi ogranicznikami jest zawsze uciążliwe. W tym przypadku, ponieważ wygląda na to, że złamany tekst jest otoczony trzema poprawnie zakodowanymi kolumnami, możemy odzyskać. TBH, to bym po prostu użyć standardowego czytnika Python i zbudować DataFrame raz z tego:

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) 

która produkuje

 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 

Wtedy możemy od razu zapisać go i dostać coś cytowany poprawnie:

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

Działa dobrze. To miłe obejście. Dzięki! W każdym razie, czy istnieje sposób, aby podłączyć się do parsera pand i dokonać podziału i łączenia rzeczy "w locie"? –