Чтобы разбить ваш 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) ]