2015-06-17 58 views
5

Tôi đang gặp loại tập tin CSV:gấu trúc python read_csv delimiter trong dữ liệu cột

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 

Tôi muốn để có được dữ liệu này vào da pandas.DataFrame. Nhưng read_csv(sep=";") ném ngoại lệ do dấu chấm phẩy trong cột tin nhắn do người dùng tạo trong dòng 2 (Theo ý kiến ​​của tôi: Thật tuyệt, hoặc ít nhất là không tệ). Tất cả các cột còn lại liên tục có dtypes dạng số.

Phương pháp thuận tiện nhất để quản lý điều này là gì?

+0

Bạn có thể giải thích thêm về vấn đề của mình không? whats dự kiến ​​của bạn đầu ra? – Kasramvd

+0

ý định của tôi là phân tích cú pháp dữ liệu csv này thành một DataFrame. Nhưng nó ném ngoại lệ bởi vì có một dấu chấm phẩy trong một cột và gấu trúc nghĩ rằng nó nên chia nó thành hai cột. –

+1

Ai đang tạo ra những tệp không rõ ràng này và có cách nào để di chuyển trên trời và trái đất để khiến chúng lành mạnh không? –

Trả lời

5

Xử lý các dấu phân cách không được trích dẫn luôn là mối phiền toái. Trong trường hợp này, vì có vẻ như văn bản bị hỏng được biết là được bao quanh bởi ba cột được mã hóa chính xác, chúng tôi có thể khôi phục. TBH, tôi chỉ cần sử dụng đầu đọc Python tiêu chuẩn và xây dựng một DataFrame một lần từ đó:

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) 

trong đó sản xuất

 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 

Sau đó, chúng tôi ngay lập tức có thể lưu nó và nhận được một cái gì đó trích dẫn một cách chính xác:

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

Hoạt động tốt. Đây là một giải pháp tốt. Cảm ơn! Dù sao, có cách nào để móc vào trình phân tích cú pháp gấu trúc và thực hiện việc chia nhỏ và ghép nội dung "đang di chuyển" không? –

Các vấn đề liên quan