Насколько я знаю, pandas не поддерживает пропуски фрагментов файла.По крайней мере, я ничего не нашел об этом в документации.
В общем, пропустить строки из файла (не читая их вообще) сложно, если вы заранее не знаете, сколько строк вы хотите пропустить и сколько символову вас есть в каждой из этих строк.В этом случае вы можете попробовать поиграть с IO и seek , чтобы переместить позицию потока в нужное место на следующей итерации.
Но это не похоже на ваш случай.
Я думаю, что лучшее, что вы можете сделать для повышения эффективности, - это прочитать строки с использованием стандартного ввода-вывода и преобразовать в кадр данных только те строки, которые вам нужны / которые вы хотите построить.
Рассмотрим, например,следующий пользовательский итератор.
При создании он сохраняет заголовок (первая строка).Каждую итерацию он читает часть строк из файла и затем пропускает следующие n*chunksize
строки.Он возвращает строку заголовка, за которой следуют строки чтения, обернутые в объект io.StringIO
(поэтому это поток и может быть передан непосредственно в pandas.read_csv
).
import io
from itertools import islice
class DfReaderChunks:
def __init__(self, filename, chunksize, n):
self.fo = open(filename)
self.chs = chunksize
self.skiplines = self.chs * n
self.header = next(self.fo)
def getchunk(self):
ll = list(islice(self.fo, self.chs))
if len(ll) == 0:
raise StopIteration
dd = list(islice(self.fo, self.skiplines))
return self.header + ''.join(ll)
def __iter__(self):
return self
def __next__(self):
return io.StringIO(self.getchunk())
def close(self):
self.fo.close()
def __del__(self):
self.fo.close()
Используя этот класс, вы можете читатьиз вашего файла:
reader = DfReaderChunks(file, chunksize, 4)
for dfst in reader:
df = pd.read_csv(dfst)
print(df) #here I print to stdout, you can plot
reader.close()
, что "эквивалентно" вашей настройке:
for chunk in pd.read_csv(file, chunksize=chunksize):
df = chunk
if (counter % 5 == 0):
print(df) #again I print, you can plot
counter += 1
Я проверил время, используемое обоими вышеупомянутыми фрагментами, используя кадр данных 39 Мб (100000 строкили случайные числа).
На моем компьютере первое занимает 0,458 секунды, а второе 0,821 секунды.
Единственный недостаток заключается в том, что первый фрагмент теряет отслеживание индекса строки (это новыйфрейм данных каждый раз, поэтому индекс всегда начинается с 0), но напечатанные фрагменты одинаковы.