Dask groupby уникален как рамка - как? - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть несколько фреймов данных:

import pandas as pd
import numpy as np

router = pd.DataFrame([
    ['2018-01-01 00:00:00', '1', 5],
    ['2018-01-01 00:30:00', '1', 7],
    ['2018-01-01 01:00:00', '1', 25],
    ['2018-01-01 01:30:00', '1', 3],
    ['2018-01-01 00:00:00', '2', 25],
    ['2018-01-01 00:30:00', '2', 7],
    ['2018-01-01 01:00:00', '2', 25],
    ['2018-01-01 01:30:00', '2', 35],
], columns=['time', 'cust_id', 'errors'])
router

enter image description here

devices = pd.DataFrame([
    ['2018-01-01 00:00:00', '1', 'dev_1'],
    ['2018-01-01 00:30:00', '1', 'dev_1'],
    ['2018-01-01 00:30:00', '1', 'dev_2'],
    ['2018-01-01 01:00:00', '1', 'dev_1'],
    ['2018-01-01 01:00:00', '1', 'dev_2'],
    ['2018-01-01 01:00:00', '1', 'dev_3'],
    ['2018-01-01 01:30:00', '1', 'dev_2'],
    ['2018-01-01 00:00:00', '2', 'dev_1'],
    ['2018-01-01 00:00:00', '2', 'dev_2'],
    ['2018-01-01 00:30:00', '2', 'dev_1'],
    ['2018-01-01 01:00:00', '2', 'dev_2'],
    ['2018-01-01 01:00:00', '2', 'dev_3'],
    ['2018-01-01 01:30:00', '2', 'dev_2'],
    ['2018-01-01 01:30:00', '2', 'dev_4'],
], columns=['time', 'cust_id', 'device_id'])
devices

enter image description here

Используя панд, я могу группировать и вычислять уникальные устройства:

devices_per_time = devices.groupby(['cust_id', 'time'])['device_id'].unique().to_frame()
devices_per_time

enter image description here

Я пытался сделать то же самое с dask:

enter image description here

У меня есть следующие вопросы:

  1. Почему я не могу использовать devices.groupby (['cust_id', 'time']) ['device_id']. unique ()?
  2. Мне удается получить результат, но я не уверен, является ли он оптимальным.Может ли кто-нибудь подтвердить, что я правильно использую dask?

С уважением.

1 Ответ

0 голосов
/ 30 декабря 2018

Вы не можете сделать .unique(), потому что это еще не реализовано для серии dask.Проверьте доступные функции: SeriesGroupby

Вот еще один способ получения результата с использованием параллельных apply и set:

(devices
.groupby(['time','cust_id'])['device_id']
.apply(set, meta=object)
.apply(list,meta=object)
.compute()
.reset_index())

Если вы неЕсли вам не нужен окончательный тип (набор или список), вы можете удалить .apply(list,meta=object)

...