2016-05-11 3 views
1

У меня есть большой текстовый файл, разделенный полуколоновым. Я пытаюсь получить значения столбца (например, второго столбца) и работать с ним итерационно с помощью numpy. Пример данных, содержащихся в текстовом файле приводится ниже:Доступ к данным в кусках с использованием Python Pandas

10862;2;1;1;0;0;0;3571;0; 
10868;2;1;1;1;0;0;3571;0; 
10875;2;1;1;1;0;0;3571;0; 
10883;2;1;1;1;0;0;3571;0; 
... 
11565;2;1;1;1;0;0;3571;0; 
11572;2;1;1;1;0;0;3571;0; 
11579;2;1;1;1;0;0;3571;0; 
11598;2;1;1;1;0;0;3571;0; 
11606;2;1;1; 

Пожалуйста, обратите внимание, что последняя строка не может содержать такое же число значений, как и предыдущие.

Я пытаюсь использовать pandas.read_csv для чтения этого большого файла кусками. Для примера, давайте предположим, что размер порции составляет 40.

я пытался до сих пор два различных подхода:

1) Набор nrows и итеративно увеличить skiprows таким образом, чтобы прочитать всю файл по куску.

nrows_set = 40 
n_it = 0 
while(1): 
    df = pd.read_csv(filename, nrows=nrows_set , sep=';',skiprows = n_it * nrows_set) 
    vect2 = df[1] # trying to access the values of the second column -- works 
    n_it = n_it+1 

Проблема при доступе к концу файла: Панды генерирует ошибку, когда те, пытается прочитать число строк превышает количество строк, содержащихся в файле. Например, если файл содержит 20 строк, а nrows - 40, файл не может быть прочитан. Мой первый подход, следовательно, вызвал ошибку, когда я пытался прочитать последние 40 строк моего файла, когда осталось менее 40 строк.

Я не знаю, как проверить конец файла перед попыткой прочитать из файла - и я не хочу загружать весь файл, чтобы получить полный номер строки, так как файл большой. Следовательно, я попробовал второй подход.

2) chunksize. Это хорошо работает, но у меня есть вопрос, когда я затем попытаться Асесс данные в куске:

reader = pd.read_csv(filename, chunksize=40, sep=';') 
for chunk in reader : 
    print(chunk) # displays data -- the data looks correct 
    chunk[1]  # trying to access the values of the second column -- generates an error 

Какой тип данных chunk, и как я могу преобразовать его так, как работает эта операция?

Как можно получить количество строк, содержащихся в файле, без загрузки всего файла в память (решение 1))?

Благодарим за помощь! Gaelle

ответ

0

chunk - это кадр данных.

так что вы можете получить доступ к нему с помощью шагового (accesors) как .ix/.loc/.iloc/.at/etc.:

chunk.ix[:, 'col_name'] 
chunk.iloc[:, 1] # second column 
+0

Отлично! Я просто пытался, и он работает отлично. Благодарю вас за быстрый ответ. Gaelle – Gaelle

+0

Извините, я слишком скоро говорил, у меня такая же ошибка, как раньше. np.diff (chunk.iloc [:, 1]) # генерирует ошибку Я думаю, я должен использовать что-то вроде pandas.DataFrame.as_matrix – Gaelle

+0

@Gaelle, вы можете использовать подобный метод панд: 'chunk.ix [ условие, 'col_name']. diff() ' – MaxU