2016-08-09 3 views
2

Ich beginne mit dem folgenden Pandas Datenrahmen, ich möchte jeden Tag gruppieren, und eine neue Spalte namens "Label", die die Gruppe mit einer laufenden Nummer beschriftet. Wie mache ich das?Wie kann Pandas groupby ein sequentielles Label zugewiesen werden?

df = pd.DataFrame({'val': [10,40,30,10,11,13]}, index=pd.date_range('2016-01-01 00:00:00', periods=6, freq='12H')) 
# df['label'] = df.groupby(pd.TimeGrouper('D')) # what do i do here??? 
print df 

Ausgang:

     val 
2016-01-01 00:00:00 10 
2016-01-01 12:00:00 40 
2016-01-02 00:00:00 30 
2016-01-02 12:00:00 10 
2016-01-03 00:00:00 11 
2016-01-03 12:00:00 13 

gewünschte Ausgabe:

    val label 
2016-01-01 00:00:00 10 1 
2016-01-01 12:00:00 40 1 
2016-01-02 00:00:00 30 2 
2016-01-02 12:00:00 10 2 
2016-01-03 00:00:00 11 3 
2016-01-03 12:00:00 13 3 
+0

Gerade FYI, ich dies brauche wegen 'sklearn.cross_validation.LabelKFold' –

Antwort

4

Try this:

df = pd.DataFrame({'val': [10,40,30,10,11,13]}, index=pd.date_range('2016-01-01 00:00:00', periods=6, freq='12H')) 

Wenn Sie gerade nach Datum gruppieren möchten:

012.351.
df['label'] = df.groupby(df.index.date).grouper.group_info[0] + 1 
print(df) 

Zur Gruppe von Zeit allgemeiner, können Sie TimeGrouper verwenden:

df['label'] = df.groupby(pd.TimeGrouper('D')).grouper.group_info[0] + 1 
print(df) 

Beide oben genannten sollten Ihnen die folgenden:

     val label 
2016-01-01 00:00:00 10  1 
2016-01-01 12:00:00 40  1 
2016-01-02 00:00:00 30  2 
2016-01-02 12:00:00 10  2 
2016-01-03 00:00:00 11  3 
2016-01-03 12:00:00 13  3 

Ich denke, das nicht dokumentiert ist (oder schwer zu finde, zumindest). Check out:

Get group id back into pandas dataframe

für weitere Diskussion.

0

vielleicht ein einfacherer und intuitiver Ansatz ist dies:

df['label'] = df.groupby(df.index.day).keys 
+0

Würde dieser Arbeit mit' pd.TimeGrouper() 'tho? Ich brauche die verallgemeinerte Version, falls ich 2 oder 5 Tage hintereinander gruppieren möchte –