2016-07-24 3 views
0

ich einen Datenrahmen mit einem Zeitstempel Spaltegroupby Datenrahmen mit neuen Spalte die Gruppe darstellt

d1=DataFrame({'a':[datetime(2015,1,1,20,2,1),datetime(2015,1,1,20,14,58), 
datetime(2015,1,1,20,17,5),datetime(2015,1,1,20,31,5), 
datetime(2015,1,1,20,34,28),datetime(2015,1,1,20,37,51),datetime(2015,1,1,20,41,19), 
datetime(2015,1,1,20,49,4),datetime(2015,1,1,20,59,21)], 'b':[2,4,26,22,45,3,8,121,34]}) 


      a    b 
0 2015-01-01 20:02:01 2 
1 2015-01-01 20:14:58 4 
2 2015-01-01 20:17:05 26 
3 2015-01-01 20:31:05 22 
4 2015-01-01 20:34:28 45 
5 2015-01-01 20:37:51 3 
6 2015-01-01 20:41:19 8 
7 2015-01-01 20:49:04 121 
8 2015-01-01 20:59:21 34 

Ich kann Gruppe von Intervallen von 15 Minuten durch diese Operationen zu tun

d2=d1.set_index('a') 

d3=d2.groupby(pd.TimeGrouper('15Min')) 

Die Anzahl der Zeilen, die von Gruppe gefunden von

d3.size() 

a 
2015-01-01 20:00:00 2 
2015-01-01 20:15:00 1 
2015-01-01 20:30:00 4 
2015-01-01 20:45:00 2 

Ich möchte meine ursprüngliche DataFrame eine Spalte haben, die dem eindeutigen entspricht Anzahl der Zeilen in der spezifischen Gruppe, zu der es gehört. Zum Beispiel kann die erste Gruppe

2015-01-01 20:00:00 

hat 2 Reihen, so dass die ersten beiden Reihen meiner neuen Spalte in d1 sollte die Zahl 1

der zweiten Gruppe so

2015-01-01 20:15:00 

hat 1 Reihe haben die dritte Reihe meiner neuen Spalte in d1 sollte die Zahl 2

die dritte Gruppe hat

2015-01-01 20:15:00 

hat 4 Reihen so die vierten, fünfte, sechste und siebte Zeile meiner neuen Spalte in d1 die Zahl 3

ich meinen neuer Datenrahmen will wie dieser

  a    b c 
0 2015-01-01 20:02:01 2 1 
1 2015-01-01 20:14:58 4 1 
2 2015-01-01 20:17:05 26 2 
3 2015-01-01 20:31:05 22 3 
4 2015-01-01 20:34:28 45 3 
5 2015-01-01 20:37:51 3 3 
6 2015-01-01 20:41:19 8 3 
7 2015-01-01 20:49:04 121 4 
8 2015-01-01 20:59:21 34 4 

Antwort

1

Gebrauch suchen haben sollte .transform() auf Ihrem groupby Objekt mit einem itertools.count Iterator:

from datetime import datetime 
from itertools import count 
import pandas as pd 

d1 = pd.DataFrame({'a': [datetime(2015,1,1,20,2,1), datetime(2015,1,1,20,14,58), 
         datetime(2015,1,1,20,17,5), datetime(2015,1,1,20,31,5), 
         datetime(2015,1,1,20,34,28), datetime(2015,1,1,20,37,51), 
         datetime(2015,1,1,20,41,19), datetime(2015,1,1,20,49,4), 
         datetime(2015,1,1,20,59,21)], 
        'b': [2, 4, 26, 22, 45, 3, 8, 121, 34]}) 
d2 = d1.set_index('a') 

counter = count(1) 
d2['c'] = (d2.groupby(pd.TimeGrouper('15Min'))['b'] 
      .transform(lambda x: next(counter))) 
print(d2) 

Ausgang:

     b c 
a       
2015-01-01 20:02:01 2 1 
2015-01-01 20:14:58 4 1 
2015-01-01 20:17:05 26 2 
2015-01-01 20:31:05 22 3 
2015-01-01 20:34:28 45 3 
2015-01-01 20:37:51 3 3 
2015-01-01 20:41:19 8 3 
2015-01-01 20:49:04 121 4 
2015-01-01 20:59:21 34 4 
+0

Nicht die Ausgabe, die ich brauche. Ich brauche jeden Wert in Spalte c in Bezug auf seine Gruppe einzigartig. – mikeL

+0

Oh, Entschuldigung, ich habe falsch verstanden. –

+0

Eine kleine Änderung und es gibt was Sie wollen: siehe Bearbeiten. –

Verwandte Themen