Разделение информационного кадра на куски на основе нескольких условий для столбца - PullRequest
1 голос
/ 14 октября 2019

У меня большой фрейм данных (+200 миллионов строк) в следующем формате

DeviceID    Date_Time
50135487    2018-03-01 00:00:44
50135487    2018-03-02 01:01:21
50135487    2018-03-01 02:01:58
50135484    2018-03-01 02:01:58
50135484    2018-03-01 02:50:13
50090879    2018-03-01 02:50:13
50090879    2018-03-01 02:50:13
50090860    2018-03-01 02:50:13
50090860    2018-03-01 02:50:13

Поскольку фрейм данных имеет около 7700 уникальных значений «DeviceID», я хочу разделить большой фрейм данныхна 8 меньших фреймов данных, чтобы я мог быстрее выполнить анализ на них.

Я пытался использовать numpy:

import numpy as np
np.array_split(df, 3)

, но он генерировал фреймы данных, где конкретный DeviceIDнаходится в нескольких фреймах данных.

Я предполагаю, что решение будет включать в себя оператор if в сочетании с groupby, но я не уверен, как это сделать.

1 Ответ

0 голосов
/ 14 октября 2019

Чтобы разбить ваш DataFrame на несколько «корзин», сохраняя каждый DeviceID в одной корзине, используйте следующий подход:

  • Вычислить value_counts для DeviceID . В результате получается Series , начиная с самых многочисленных групп.
  • Преобразуйте его в DataFrame и добавьте столбец, состоящий из номеров бинов, с циклическим изменением от 0 до binNo .

Код для этого:

binNo = 3    # Number of bins
vc = df.DeviceID.value_counts().rename('cnt')
vc = vc.to_frame().assign(bin=[ i % binNo for i in range(vc.size) ]); vc

Для данных моего примера (немного изменив и расширив ваш образец),результат:

          cnt  bin
50135487    2    0
50135484    2    1
50090860    2    2
50090879    2    0
50090869    1    1
50090850    1    2
50135488    1    0

cnt - количество вхождений каждого DeviceID и bin - назначение бина для этого DeviceID .

Затем определите список функций, генерирующий DeviceID с для bin n :

def genDf(n):
    return vc[vc.bin == n].index

И сгенерируйте списокDataFrames (bin), выполнить:

dfLst = [ df[df.DeviceID.isin(genDf(i))] for i in range(binNo) ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...