Tengo un df:

    0           1    2     3     4  
0   44.000000   0.0  0.0   0.0   0.0    
1   42.200001   0.0  0.0   0.0   0.0        
2   44.799999   0.0  0.0   0.0   0.0    
3   47.520000   0.0  0.0   0.0   0.0
4   49.760000   0.0  0.0   0.0   0.0
5   53.420000   0.0  0.0   0.0   0.0

Mi salida esperada es tener (cada elemento en columnas, tener los siguientes 3 valores en una fila):

    0           1            2           3      
0   44.000000   42.200001    44.799999   47.520000      
1   42.200001   44.799999    47.520000   49.760000          
2   44.799999   47.520000    49.760000   53.420000  
3   47.520000   etc.
4   49.760000   etc. 
5   53.420000

Lo que intento hacer aquí es ir rápido (la tarea es llegar a cierta velocidad), estoy pensando si creo un df vacío y luego uso .apply (lambda: #fncineed, axis = 1) puede mejorar Rendimiento mucho más. (en lugar de pasar por todo el índice de datos y aplicar fnc a la ventana móvil)

1
thomas.mac 1 nov. 2017 a las 05:52

3 respuestas

La mejor respuesta

Intentemos esto si entiendo su pregunta correctamente:

df.apply(lambda x: df['0'].shift(-df.columns.get_loc(x.name)))

Salida:

           0          1          2      3      4
0  44.000000  42.200001  44.799999  47.52  49.76
1  42.200001  44.799999  47.520000  49.76  53.42
2  44.799999  47.520000  49.760000  53.42    NaN
3  47.520000  49.760000  53.420000    NaN    NaN
4  49.760000  53.420000        NaN    NaN    NaN
5  53.420000        NaN        NaN    NaN    NaN
3
Scott Boston 1 nov. 2017 a las 03:07

Si desea que cada columna 1-3 contenga los tres valores que siguen a la columna 0, en fila, puede usar shift():

n = 3
pd.concat([df.iloc[:,0], 
           df.iloc[:,1:].apply(lambda x: (df.iloc[:,0]
                                            .shift(-int(x.name))[:n])
                                            .iloc[:,:n]]), axis=1)

           0          1          2      3
0  44.000000  42.200001  44.799999  47.52
1  42.200001  44.799999  47.520000  49.76
2  44.799999  47.520000  49.760000  53.42
3  47.520000        NaN        NaN    NaN
4  49.760000        NaN        NaN    NaN
5  53.420000        NaN        NaN    NaN

Esto supone que no desea completar cols 1-3 si no hay 3 valores disponibles.

1
andrew_reece 1 nov. 2017 a las 03:10

O puedes probar esto

new=pd.concat([df['0'].shift(-x) for x in list(range(df.shape[1]))],axis=1)
new.columns=df.columns
new
Out[178]: 
           0          1          2      3      4
0  44.000000  42.200001  44.799999  47.52  49.76
1  42.200001  44.799999  47.520000  49.76  53.42
2  44.799999  47.520000  49.760000  53.42    NaN
3  47.520000  49.760000  53.420000    NaN    NaN
4  49.760000  53.420000        NaN    NaN    NaN
5  53.420000        NaN        NaN    NaN    NaN
0
YOBEN_S 1 nov. 2017 a las 03:37