Как вводить большие данные в python pandas с использованием циклов или параллельных вычислений?
У меня есть файл csv 8gb, и я не могу запустить код, так как он показывает ошибку памяти.
file = "./data.csv"
df = pd.read_csv(file, sep="/", header=0, dtype=str)
Я хотел бы разбить файлы на 8 небольших файлов ( "отсортировано по id" ) с помощью python. И fianlly, иметь петлю, чтобы выходной файл имел выход из всех 8 файлов.
Или я хотел бы попробовать параллельные вычисления. Основная задача состоит в обработке данных 8gb в python pandas. Спасибо.
Мой файл csv содержит многочисленные данные с '/' в качестве разделителя запятой,
id venue time code value ......
AAA Paris 28/05/2016 09:10 PAR 45 ......
111 Budapest 14/08/2016 19:00 BUD 62 ......
AAA Tokyo 05/11/2016 23:20 TYO 56 ......
111 LA 12/12/2016 05:55 LAX 05 ......
111 New York 08/01/2016 04:25 NYC 14 ......
AAA Sydney 04/05/2016 21:40 SYD 2 ......
ABX HongKong 28/03/2016 17:10 HKG 5 ......
ABX London 25/07/2016 13:02 LON 22 ......
AAA Dubai 01/04/2016 18:45 DXB 19 ......
.
.
.
.
Ответы
Ответ 1
import numpy as np
from multiprocessing import Pool
def processor(df):
# Some work
df.sort_values('id', inplace=True)
return df
size = 8
df_split = np.array_split(df, size)
cores = 8
pool = Pool(cores)
for n, frame in enumerate(pool.imap(processor, df_split), start=1):
frame.to_csv('{}'.format(n))
pool.close()
pool.join()
Ответ 2
Используйте параметр chunksize
для чтения одного фрагмента в то время и сохранения файлов на диск. Это разделит исходный файл равными частями на 100000 строк:
file = "./data.csv"
chunks = pd.read_csv(file, sep="/", header=0, dtype=str, chunksize = 100000)
for it, chunk in enumerate(chunks):
chunk.to_csv('chunk_{}.csv'.format(it), sep="/")
Если вам известно количество строк исходного файла, вы можете вычислить точный chunksize
, чтобы разбить файл на 8 равных частей (nrows/8
).
Ответ 3
pandas read_csv имеет две опции аргументов, которые вы могли бы использовать для выполнения своих действий:
nrows : to specify the number of rows you want to read
skiprows : to specify the first row you want to read
Обратитесь к документации по адресу: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
Ответ 4
Вы также можете использовать фреймворк das и он встроен в dask.dataframe. По сути, файл csv преобразуется в несколько фреймов pandas, каждый из которых считывается, когда это необходимо. Тем не менее, не каждая команда pandas является avaialble внутри dask.
Ответ 5
Если вам не нужны все столбцы, вы также можете использовать параметр usecols
:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
usecols : array-like or callable, default None
Return a subset of the columns. [...]
Using this parameter results in much faster parsing time and lower memory usage.