2015-07-10 4 views
0

У меня есть файл данных, как например:Импорт данных в DataFrame с дополнительными запятыми

ID,ORIG,TIME,TEXT 
364,1,7-10-15,This works fine 
16254,1,7-10-15,But, I don't work :(
9846,0,7-10-15,Neither, do, I 

Когда я импортировать с помощью панд Я пытаюсь получить следующее:

+-------+------+---------+----------------------+ 
| ID | ORIG | TIME | TEXT     | 
+=======+======+=========+======================+ 
| 3464 | 1 | 7-10-15 | This works fine  | 
+-------+------+---------+----------------------+ 
| 16254 | 1 | 7-10-15 | But, I don't work :(| 
+-------+------+---------+----------------------+ 
| 9846 | 0 | 7-10-15 | Neither, do, I  | 
+-------+------+---------+----------------------+ 

Используя мой сценарий data_df = pd.read_csv('data.csv', low_memory=False) , когда я импортирую 1-ю строку, все в порядке (без индекса).

Однако со второй строкой, так как там есть запятая, данные, которые первоначально были в ID, перемещаются в индексный столбец, и все перемещается 1 влево.

+-------+----+---------+-----------------+-----------------+ 
|  | ID | ORIG | TIME   | TEXT   | 
+=======+====+=========+=================+=================+ 
| 3464 | 1 | 7-10-15 | This works fine | NaN    | 
+-------+----+---------+-----------------+-----------------+ 
| 16254 | 1 | 7-10-15 | But    | I don't work :(| 
+-------+----+---------+-----------------+-----------------+ 

Образец повторяется с более запятыми, находящимися в последнем столбце. Возможно, solution - это переписать файл, но я пытаюсь найти способ просто импортировать его, не переписывая каждый файл (у меня около 65+).

Мой вопрос:

Можно ли импортировать (в строке) первый столбец в «ID» второй колонке на «туринг» третий столбец «TIME» и все остальное в «TEXT»?

+0

Имеются ли в ваших данных все эти '+' и '-' и' = '? – DSM

+0

Нет, это просто для просмотра. – Leb

+0

Можете ли вы добавить, как выглядит фактический ввод? –

ответ

4

Ваш CSV имеет неверный формат, потому что он не использует кавычки, чтобы отличить запятые, которые разделители из запятых, которые являются частью значения поля.

Однако, мы могли перебирать строки CSV и использовать str.split(',', 3) разделить на только первые 3 запятых:

lines = (line.split(',',3) for line in f) 

Мы можем передать этот итератор непосредственно pd.DataFrame:

df = pd.DataFrame(lines, columns=header) 

Это не так быстро загружает действительный CSV, используя оптимизированный синтаксический анализатор pd.read_csv, но я думаю, что результат довольно хорош, учитывая ввод неверно.


import numpy as np 
import pandas as pd 

with open('data', 'r') as f: 
    header = [item.strip() for item in next(f).split(',')] 
    lines = (line.split(',', 3) for line in f) 
    df = pd.DataFrame(lines, columns=header) 
    df = df.convert_objects(convert_numeric=True) 
    df['TIME'] = pd.to_datetime(df['TIME']) 

print(df) 

дает

 ID ORIG  TIME     TEXT 
0 364  1 2015-07-10  This works fine\n 
1 16254  1 2015-07-10 But, I don't work :(\n 
2 9846  0 2015-07-10  Neither, do, I 

с

print(df.dtypes) 
# ID    int64 
# ORIG    int64 
# TIME datetime64[ns] 
# TEXT   object 
# dtype: object 
+0

Все ответы работали, но поскольку ваш результат был более быстрым для моих больших файлов, я отмечен как принятый ответ – Leb

+0

Фактически, этот ответ * лучше (по крайней мере, мой), потому что он прекращает расщепление после 3 запятые. –

2

Это немного некрасиво, но вы можете использовать DataFrame.from_records используя на лету данные:

crap = [l.split(',')[: 3] + [''.join(l.strip().split(',')[3: ])] \ 
    for l in open('stuff.csv').readlines()] 
>> pd.DataFrame.from_records(crap[1: ], columns=crap[0]) 
     ID ORIG  TIME     TEXT 
0 364 1 7-10-15  This works fine 
1 16254 1 7-10-15 But I don't work :(
2 9846 0 7-10-15   Neither do I 
1

Хотя Есть несколько способов, чтобы заставить это работать полностью панды стороны, это гораздо проще сделать это с помощью csv, что я только что сделаю это:

import csv, io, pandas as pd 
data = io.StringIO() 
with open("leb.csv", newline="") as fp: 
    reader = csv.reader(fp) 
    rows = [row[:3] + [','.join(row[3:])] for row in reader] 
    writer = csv.writer(data) 
    writer.writerows(rows) 

data.seek(0) 
df = pd.read_csv(data) 

Это эффективно фиксирует входные данные до того, как панды когда-либо его видят. Это дает

>>> df 
     ID ORIG  TIME     TEXT 
0 364  1 7-10-15  This works fine 
1 16254  1 7-10-15 But, I don't work :(
2 9846  0 7-10-15  Neither, do, I 
Смежные вопросы