Подтвердить что ты не робот

Как я могу фильтровать строки при загрузке в функции Pandas read_csv?

Как я могу фильтровать, какие строки CSV загружаются в память с помощью pandas? Это похоже на вариант, который нужно найти в read_csv. Я что-то пропустил?

Пример: у нас есть CSV с столбцом timestamp, и мы хотели бы загружать только строки с меткой времени, превышающей заданную константу.

4b9b3361

Ответ 1

Невозможно отфильтровать строки перед загрузкой CSV файла в объект pandas.

Вы можете либо загрузить файл, а затем выполнить фильтрацию, используя df[df['field'] > constant], или, если у вас очень большой файл, и вы беспокоитесь о нехватке памяти, тогда используйте итератор и применяйте фильтр по мере объединения куски вашего файла, например:

import pandas as pd
iter_csv = pd.read_csv('file.csv', iterator=True, chunksize=1000)
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])

Вы можете изменить chunksize в соответствии с доступной памятью. Смотрите здесь для более подробной информации.

Ответ 2

Я не нашел прямого способа сделать это в контексте read_csv. Однако read_csv возвращает DataFrame, который можно отфильтровать, выбирая строки по логическому вектору df[bool_vec]:

filtered = df[(df['timestamp'] > targettime)]

Это выбор всех строк в df (предполагается, что df - это любой DataFrame, такой как результат вызова read_csv, который по крайней мере содержит столбец datetime timestamp), для которого значения в столбце timestamp больше, чем значение целевого времени. Похожие вопросы.

Ответ 3

Вы можете указать параметр nrows.

import pandas as pd df = pd.read_csv('file.csv', nrows=100)

Этот код хорошо работает в версии 0.20.3.

Ответ 4

Если вы используете Linux, вы можете использовать grep.

# to import either on Python2 or Python3
import pandas as pd
from time import time # not needed just for timing
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO


def zgrep_data(f, string):
    '''grep multiple items f is filepath, string is what you are filtering for'''

    grep = 'grep' # change to zgrep for gzipped files
    print('{} for {} from {}'.format(grep,string,f))
    start_time = time()
    if string == '':
        out = subprocess.check_output([grep, string, f])
        grep_data = StringIO(out)
        data = pd.read_csv(grep_data, sep=',', header=0)

    else:
        # read only the first row to get the columns. May need to change depending on 
        # how the data is stored
        columns = pd.read_csv(f, sep=',', nrows=1, header=None).values.tolist()[0]    

        out = subprocess.check_output([grep, string, f])
        grep_data = StringIO(out)

        data = pd.read_csv(grep_data, sep=',', names=columns, header=None)

    print('{} finished for {} - {} seconds'.format(grep,f,time()-start_time))
    return data

Ответ 5

Мне удалось загрузить CSV через это.

import pandas as pd
iter_csv = pd.read_csv('file.csv', iterator=True, chunksize=1000)
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])

Тем не менее, я заметил, что количество результатов (показанных в df.shape) варьируется в зависимости от размера фрагмента..... любая идея?