2016-07-01 11 views
1

Ich arbeite an einem Multiindex-Serie Mixed-Typen Werte (timedeltas und int) enthält:Beeinflusst Pandas.Series.unstack() Datentypen?

char 
7  a 103 minutes 
     s    63 
9  a 129 minutes 
     s   211 
10 a 106 minutes 
     s    63 
Name: timestamp, dtype: object 

Index:

MultiIndex(levels=[[7, 9, 10], ['a', 's']], 
      labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]], 
      names=['char', None]) 

Wenn ich versuche, es pandas.Series.unstack() mit Unstack, wandelt es alle Werte zu Timedeltas (mit einer anderen Genauigkeit):

a   s 
char   
7 01:43:00 00:00:00.000000 
9 02:09:00 00:00:00.000000 
10 01:46:00 00:00:00.000000 

Weiß jemand woher das kommt?

EDIT

ist hier ein paar mehr Infos. Probe der Originaldaten:

timestamp   char 
0 2008-01-15 23:56:52 7 
1 2008-01-16 00:07:28 7 
2 2008-01-01 16:12:32 9 
3 2008-01-03 01:52:08 9 
4 2008-07-06 17:23:25 10 
5 2008-07-06 17:33:47 10 

ich extrahieren ein paar Features:

def get_session(ts): 
    ts = ts.sort_index() 
    dt = (ts - ts.shift()).fillna(0) 
    first_logs = dt > '30m' 
    sessions = first_logs.cumsum() + 1 
    duration = sessions.value_counts().mean() * np.timedelta64(10, 'm') 
    return pd.Series({'s': max(sessions), 'a': duration}) 

timetable = data.groupby('char')[' timestamp'].apply(get_session) 

Was gibt mir:

char 
7  a 20 minutes 
     s    1 
9  a 10 minutes 
     s    2 
10 a 20 minutes 
     s    1 
Name: timestamp, dtype: object 

, die nach dem aussehen wie entstapelt werden:

timetable.unstack() 

a s 
char   
7 00:20:00 00:00:00.000000 
9 00:10:00 00:00:00.000000 
10 00:20:00 00:00:00.000000 
+0

können Sie Rohdaten und Code schreiben, dies zu reproduzieren, und deine pandas und numpy version danke – EdChum

Antwort

3

Es sieht aus wie Käfer.

ich glaube, Sie von der Funktion DataFrame zurückkehren und dann unstack ist nicht notwendig:

def get_session(ts): 
    ts = ts.sort_index() 
    dt = (ts - ts.shift()).fillna(0) 
    first_logs = dt > '30m' 
    sessions = first_logs.cumsum() + 1 
    duration = sessions.value_counts().mean() * np.timedelta64(10, 'm') 
    return pd.DataFrame({'s': max(sessions), 'a': duration}, index=[0]) 

timetable = data.groupby('char')['timestamp'].apply(get_session) 
print (timetable) 
       a s 
char    
7 0 00:20:00 1 
9 0 00:10:00 2 
10 0 00:20:00 1 

Aber es gibt Probleme mit dem Index (zweite Ebene sind alle 0), so dass Sie Index aus Spalte s erstellen und dann Set Index name von rename_axis (neu in pandas0.18.0):

def get_session(ts): 
    ts = ts.sort_index() 
    dt = (ts - ts.shift()).fillna(0) 
    first_logs = dt > '30m' 
    sessions = first_logs.cumsum() + 1 
    duration = sessions.value_counts().mean() * np.timedelta64(10, 'm') 
    return pd.DataFrame({'a': duration}, index=[max(sessions)]).rename_axis('s') 

timetable = data.groupby('char')['timestamp'].apply(get_session) 
print (timetable) 
       a 
char s   
7 1 00:20:00 
9 2 00:10:00 
10 1 00:20:00 
+0

Danke für deine Lösung! Ich habe '' MultiIndex.droplevel (1) '' verwendet, um die Nullen zu löschen, aber Ihre Lösung ist kürzer. Definitiv etwas Seltsames, das mit dem Timedelta hart läuft. – Crolle