Как я могу фильтровать строки при загрузке в функции Pandas read_csv?
Как я могу фильтровать, какие строки CSV загружаются в память с помощью pandas? Это похоже на вариант, который нужно найти в read_csv
. Я что-то пропустил?
Пример: у нас есть CSV с столбцом timestamp, и мы хотели бы загружать только строки с меткой времени, превышающей заданную константу.
Ответы
Ответ 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) варьируется в зависимости от размера фрагмента..... любая идея?