У меня есть большой кадр данных (несколько миллионов строк).Как правильно перебирать последовательные куски данных DataFrame
Я хочу иметь возможность выполнять операцию groupby на нем, а просто группировать произвольные последовательные (предпочтительно равные) подмножества строк, а не использовать какое-либо конкретное свойство отдельных строк, чтобы решить, к какой группе они переходят ,
Вариант использования: Я хочу применить функцию к каждой строке через параллельную карту в IPython. Не имеет значения, какие строки попадают в какой-то back-end движок, поскольку функция вычисляет результат на основе одной строки за раз. (Концептуально, по крайней мере, в действительности это векторизация.)
Я придумал что-то вроде этого:
# Generate a number from 0-9 for each row, indicating which tenth of the DF it belongs to
max_idx = dataframe.index.max()
tenths = ((10 * dataframe.index)/(1 + max_idx)).astype(np.uint32)
# Use this value to perform a groupby, yielding 10 consecutive chunks
groups = [g[1] for g in dataframe.groupby(tenths)]
# Process chunks in parallel
results = dview.map_sync(my_function, groups)
Но это, кажется, очень многословно, и не гарантирует куски одинакового размера. Особенно, если индекс разрежен или нецелое или что-то еще.
Любые предложения по улучшению?
Спасибо!
Это то, что я имел в виду! Ну технически "df.groupby (np.arange (len (df)) // (len (df)/10))", чтобы получить фиксированное количество групп (1 на ядро) вместо фиксированного размера. По какой-то причине мне не пришло в голову, что ключ группировки вообще не должен быть связан с индексом ... –
Стоит отметить, что для эффективности, вероятно, лучше прочитать исходный файл с помощью «итератора» (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html) и «chunksize», так что функция read_csv выполняет чтение, и каждый фрагмент может быть передан в отдельный процесс, как описано в @Ryan –