2015-06-17 2 views
5

Я, имеющий этот тип CSV файла:питон панды read_csv разделителя в колонке данных

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 

Я хочу, чтобы получить эти данные в да pandas.DataFrame. Но read_csv(sep=";") выдает исключения из-за точки с запятой в столбце сообщений, созданных пользователем в строке 2 (На мой взгляд: это круто или, по крайней мере, неплохо). Все остальные столбцы постоянно имеют числовые типы.

Что является самым удобным способом управления этим?

+0

Не могли бы вы подробнее рассказать о своей проблеме? Каков ваш ожидаемый результат? – Kasramvd

+0

Мое намерение состоит в том, чтобы проанализировать данные csv в DataFrame. Но это исключает исключение, потому что в одной колонке есть точка с запятой, и панды думают, что она должна разделить ее на два столбца. –

+1

Кто генерирует эти двусмысленные файлы и есть ли способ переместить небо и землю, чтобы они стали разумными? –

ответ

5

Работа с некотируемыми разделителями всегда является неприятностью. В этом случае, поскольку похоже, что разбитый текст, как известно, окружен тремя правильно закодированными столбцами, мы можем восстановить. ТВН, я бы просто использовать стандартный ридер Python и построить DataFrame один раз из этого:

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) 

, который производит

 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 

Тогда мы можем сразу же сохранить его и получить что-то цитировал правильно:

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

Работает отлично. Это приятное обходное решение. Благодаря! Во всяком случае, есть ли способ подключиться к парсеру pandas и сделать расщепление и соединение вещей «на лету»? –