2016-09-13 6 views
3

Ich habe einen Datenrahmen, in dem jede Instanz einen Zeitstempel hat, eine ID und eine Liste von Zahlen wie folgt:Pandas aggregierte Liste in 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] 

Für jeden id ich von Tag gesampelt werden soll (und das ist einfach) und verketten alle Listen der Instanzen, die am selben Tag passiert sind. Resampling + concat/Summe nicht nicht funktionieren, weil resample alle nicht-numerischen Spalten entfernt (see here)

ich etwas Ähnliches schreiben wollen:

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

Ergebnis gewünscht:

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] 

Hier können Sie ein Skript kopieren, das den Eingang generiert, den ich für die Beschreibung verwendet habe:

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) 

Bonuspunkte, wenn es möglich ist, Duplikate in der verketteten Liste optional zu entfernen.

Antwort

5

Wie @jezrael wies darauf hin, dies funktioniert nur in Pandas Version 0.18.1+

  • set_index mit 'timestamp' prep für die spätere resample
  • groupby'id' Spalte und wählen Sie lists Spalten
  • nach resample, sum der Listen verketten sie
  • reset_index zu Spalten in der richtigen Reihenfolge

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

enter image description here

+0

Das löst mein Problem! Ich habe den gleichen Code verwendet, aber ohne den Spaltennamen "lists" angegeben zu haben und nur timestamp und id zurückgegeben. Vielen Dank :-) – Ludovica

0

für die einzigartige Zählung jedes Listenelement Verständnis Verwendung Liste erhalten:

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