Совокупный список Pandas в resample/groupby

У меня есть кадр данных, в котором каждый экземпляр имеет метку времени, идентификатор и список чисел следующим образом:

timestamp           | id | lists
----------------------------------
2016-01-01 00:00:00 | 1  | [2, 10]
2016-01-01 05:00:00 | 1  | [9, 10, 3, 5]
2016-01-01 10:00:00 | 1  | [1, 10, 5]
2016-01-02 01:00:00 | 1  | [2, 6, 7]
2016-01-02 04:00:00 | 1  | [2, 6]
2016-01-01 02:00:00 | 2  | [0]
2016-01-01 08:00:00 | 2  | [10, 3, 2]
2016-01-01 14:00:00 | 2  | [0, 9, 3]
2016-01-02 03:00:00 | 2  | [0, 9, 2]

Для каждого идентификатора я хочу выполнить повторную выборку по дням (и это легко) и объединить все списки экземпляров, которые произошли в один и тот же день. Resample + concat/sum не работает, потому что resample удаляет все нечисловые столбцы (см. здесь< /а>)

Я хочу написать что-то похожее на это:

daily_data = data.groupby('id').resample('1D').concatenate() # .concatenate() does not exist

Желаемый результат:

timestamp  | id | lists
----------------------------------
2016-01-01 | 1  | [2, 10, 9, 10, 3, 5, 1, 10, 5]
2016-01-02 | 1  | [2, 6, 7, 2, 6]
2016-01-01 | 2  | [0, 10, 3, 2]
2016-01-02 | 2  | [0, 9, 3, 0, 9, 2]

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

import pandas as pd 
from random import randint

time = pd.to_datetime( ['2016-01-01 00:00:00', '2016-01-01 05:00:00', 
                        '2016-01-01 10:00:00', '2016-01-02 01:00:00', 
                        '2016-01-02 04:00:00', '2016-01-01 02:00:00', 
                        '2016-01-01 08:00:00', '2016-01-01 14:00:00',
                        '2016-01-02 03:00:00' ]
                      )

id_1 = [1] * 5
id_2 = [2] * 4

lists = [0] * 9
for i in range(9):
    l = [randint(0,10)  for _ in range(randint(1,5) ) ]
    l = list(set(l))
    lists[i] = l

data = {'timestamp': time, 'id': id_1 + id_2, 'lists': lists}

example = pd.DataFrame(data=data)

Бонусные баллы, если есть способ при желании удалить дубликаты в объединенном списке.


person Ludovica    schedule 13.09.2016    source источник


Ответы (2)


Как указал @jezrael, это работает только в пандах версии 0.18.1+.

  • set_index с 'timestamp' для подготовки к следующему resample
  • groupby 'id' столбец и выберите lists столбцов
  • после resample, sum списков объединят их
  • reset_index чтобы получить столбцы в правильном порядке

df.set_index('timestamp').groupby('id').lists.resample('D').sum() \
  .reset_index('id').reset_index()

введите здесь описание изображения

person piRSquared    schedule 13.09.2016
comment
Это решает мою проблему! Я использовал тот же код, но без указания списков имен столбцов и возвращал только временную метку и идентификатор. Спасибо :-) - person Ludovica; 13.09.2016

для уникального количества каждого элемента списка используйте понимание списка:

a = [list(set(l)) for l in df.lists]
df.loc[:,'lists'] = a
person NickBraunagel    schedule 13.09.2016