Reorganización de pandas Python

Tengo el siguiente dataframe:

Timestamp S_time1 S_time2 End_Time_1 End_time_2 Sign_1 Sign_2 0 2413044 0 0 0 0 xx 1 2422476 0 0 0 0 xx 2 2431908 0 0 0 0 xx 3 2441341 0 0 0 0 xx 4 2541232 2526631 2528631 2520631 2530631 10 80 5 2560273 2544946 2546496 2546496 2548496 40 80 6 2577224 2564010 2566010 2566010 2568010 null null 7 2592905 2580959 2582959 2582959 2584959 null null 

La mesa sigue y sigue así. La primera columna es una marca de tiempo que está en milisegundos. S_time1 y End_time_1 son la duración en la que aparece un signo (número) en particular. Por ejemplo, si tomamos la quinta fila, S_time1 es 2526631, End_time_1 es 2520631, y el sign_1 correspondiente_1 es 10, lo que significa que desde 2526631 hasta 2520631 se mostrará el signo 10. Y lo mismo se S_time2 a S_time2 y End_time_2 . Los valores correspondientes en sign_2 aparecerán en la duración desde S_time2 hasta End_time_2 .

Quiero volver a muestrear la columna de índice ( Timestamp ) en un Timestamp de 100 milisegundos y comprobar a qué intervalo pertenecen los signos. Por ejemplo, entre cada hora de inicio y hora de finalización hay una diferencia de 2000 milisegundos. Por lo tanto, el número de signo correspondiente aparecerá repetidamente en alrededor de 20 tiempos consecutivos de bin porque cada tiempo de bin es de 100 milisegundos. Así que necesito tener solo dos columnas: una con los tiempos de bin y la segunda con los signos. Se parece a la siguiente tabla: (sólo estoy inventando el tiempo del contenedor, por ejemplo)

 Bin_time signs ...100 0 ...200 0 ...300 10 ...400 10 ...500 10 ...600 10 

El signo 10 será por la duración del S_time1 correspondiente a End_time_1. Luego, el siguiente signo que es 80 continúa durante la duración de S_time2 a End_time_2. No estoy seguro de si esto se puede hacer en pandas o no. Pero realmente necesito ayuda, ya sea en pandas u otros métodos.

Gracias por su ayuda y sugerencia de antemano.

Entrada:

 print df Timestamp S_time1 S_time2 End_Time_1 End_time_2 Sign_1 Sign_2 0 2413044 0 0 0 0 xx 1 2422476 0 0 0 0 xx 2 2431908 0 0 0 0 xx 3 2441341 0 0 0 0 xx 4 2541232 2526631 2528631 2520631 2530631 10 80 5 2560273 2544946 2546496 2546496 2548496 40 80 6 2577224 2564010 2566010 2566010 2568010 null null 7 2592905 2580959 2582959 2582959 2584959 null null 

2 enfoques:

 In [231]: %timeit s(df) 1 loops, best of 3: 2.78 s per loop In [232]: %timeit m(df) 1 loops, best of 3: 690 ms per loop 
 def m(df): #resample column Timestamp by 100ms, convert bak to integers df['Timestamp'] = df['Timestamp'].astype('timedelta64[ms]') df['i'] = 1 df = df.set_index('Timestamp') df1 = df[[]].resample('100ms', how='first').reset_index() df1['Timestamp'] = (df1['Timestamp'] / np.timedelta64(1, 'ms')).astype(int) #felper column i for merging df1['i'] = 1 #print df1 out = df1.merge(df,on='i', how='left') out1 = out[['Timestamp', 'Sign_1']][(out.Timestamp >= out.S_time1) & (out.Timestamp <= out.End_Time_1)] out2 = out[['Timestamp', 'Sign_2']][(out.Timestamp >= out.S_time2) & (out.Timestamp <= out.End_time_2)] out1 = out1.rename(columns={'Sign_1':'Bin_time'}) out2 = out2.rename(columns={'Sign_2':'Bin_time'}) df = pd.concat([out1, out2], ignore_index=True).drop_duplicates(subset='Timestamp') df1 = df1.set_index('Timestamp') df = df.set_index('Timestamp') df = df.reindex(df1.index).reset_index() #print df.head(10) 
 def s(df): #resample column Timestamp by 100ms, convert bak to integers df['Timestamp'] = df['Timestamp'].astype('timedelta64[ms]') df = df.set_index('Timestamp') out = df[[]].resample('100ms', how='first') out = out.reset_index() out['Timestamp'] = (out['Timestamp'] / np.timedelta64(1, 'ms')).astype(int) #print out.head(10) #search start end def search(x): mask1 = (df.S_time1<=x['Timestamp']) & (df.End_Time_1>=x['Timestamp']) #if at least one True return first value of series if mask1.any(): return df.loc[mask1].Sign_1[0] #check second start and end time else: mask2 = (df.S_time2<=x['Timestamp']) & (df.End_time_2>=x['Timestamp']) if mask2.any(): #if at least one True return first value return df.loc[mask2].Sign_2[0] else: #if all False return NaN return np.nan out['Bin_time'] = out.apply(search, axis=1) #print out.head(10)