read_csv читает строки со значением, содержащимся в столбце другого фрейма данных - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю с большими фреймами данных (15 ГБ), и каждый раз, когда я пытаюсь открыть их, возникает ошибка памяти.

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

Следуя этому сообщению пропустить спецификацию c строку, которая содержит определенное значение при чтении pandas фрейма данных Я пытался использовать:

import StringIO
import pandas as pd

emptylist = []
def read_file(file_name):
    with open(file_name, 'r') as fh:
        for line in fh.readlines():
            parts = line.split(',')
            if parts[0] not in emptylist:
                emptylist.append(parts[0])
                if parts[0] in set(idlist):
                    yield line

stream = StringIO.StringIO()
stream.writelines(read_file('B.csv'))
stream.seek(0)

df = pd.read_csv(stream)

, где должен быть пустой список содержат уникальные значения идентификатора информационного кадра B, а idlist - это идентификатор столбца информационного кадра A, преобразованного в список.

Проблема заключается в том, что он по-прежнему выдает ошибку памяти в файле stream.writelines (read_file ('B.csv') )), и я не понимаю, почему, поскольку число строк в Dataframe A должно быть точно таким же, а число столбцов B равно только 2, в сравнении с 3 набора данных A, который вместо этого я могу открыть.

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 03 апреля 2020

Это все еще ошибка remories, потому что вы все еще считываете B.csv в ОЗУ для обработки. Вы можете использовать это:

with open("B.csv") as infile:
    for line in infile:
        do_something_with(line)

Он читает только одну строку за раз. Когда читается следующая строка, предыдущая будет собираться мусором, если вы не сохранили ссылку на нее где-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...