Cómo desplazar una columna en Pandas DataFrame

Me gustaría mover una columna en un DataFrame Pandas, pero no he podido encontrar un método para hacerlo desde la documentación sin volver a escribir todo el DF. Alguien sabe como hacerlo? Marco de datos:

 ## x1 x2 ##0 206 214 ##1 226 234 ##2 245 253 ##3 265 272 ##4 283 291 

Salida deseada:

 ## x1 x2 ##0 206 nan ##1 226 214 ##2 245 234 ##3 265 253 ##4 283 272 ##5 nan 291 

 In [18]: a Out[18]: x1 x2 0 0 5 1 1 6 2 2 7 3 3 8 4 4 9 In [19]: a.x2 = a.x2.shift(1) In [20]: a Out[20]: x1 x2 0 0 NaN 1 1 5 2 2 6 3 3 7 4 4 8 

Si no quiere perder las columnas que desplaza más allá del final de su dataframe, simplemente agregue el número requerido primero:

  offset = 5 DF = DF.append([np.nan for x in range(offset)]) DF = DF.shift(periods=offset) DF = DF.reset_index() #Only works if sequential index 

Supongo que importa

 import pandas as pd import numpy as np 

Primero agregue una nueva fila con NaN, NaN,... al final de DataFrame ( df ).

 s1 = df.iloc[0] # copy 1st row to a new Series s1 s1[:] = np.NaN # set all values to NaN df2 = df.append(s1, ignore_index=True) # add s1 to the end of df 

Se creará nuevo DF df2. Quizás haya una forma más elegante pero esto funciona.

Ahora puedes cambiarlo:

 df2.x2 = df2.x2.shift(1) # shift what you want 

Permite definir el dataframe de su ejemplo por

 >>> df = pd.DataFrame([[206, 214], [226, 234], [245, 253], [265, 272], [283, 291]], columns=[1, 2]) >>> df 1 2 0 206 214 1 226 234 2 245 253 3 265 272 4 283 291 

Entonces podrías manipular el índice de la segunda columna por

 >>> df[2].index = df[2].index+1 

y finalmente volver a combinar las columnas individuales

 >>> pd.concat([df[1], df[2]], axis=1) 1 2 0 206.0 NaN 1 226.0 214.0 2 245.0 234.0 3 265.0 253.0 4 283.0 272.0 5 NaN 291.0 

Quizás no sea rápido pero fácil de leer. Considere establecer variables para los nombres de columna y el cambio real requerido.

Edición: En general, el desplazamiento es posible mediante df[2].shift(1) como ya se ha publicado, sin embargo, eso cortaría el arrastre.

Necesitas usar df.shift aquí

df.shift (i) desplaza toda la ttwig de datos en i unidades hacia abajo.

Así que para i = 1

Entrada:

  x1 x2 0 206 214 1 226 234 2 245 253 3 265 272 4 283 291 

Salida:

  x1 x2 0 Nan Nan 1 206 214 2 226 234 3 245 253 4 265 272 

Así que ejecuta este script para obtener el resultado esperado

 import pandas as pd df = pd.DataFrame({'x1': ['206', '226', '245',' 265', '283'], 'x2': ['214', '234', '253', '272', '291']}) print(df) df['x2'] = df['x2'].shift(1) print(df) 

Tratando de responder a un problema personal y similar al tuyo, encontré en Pandas Doc lo que creo que respondería a esta pregunta:

DataFrame.shift (periodos = 1, freq = Ninguno, eje = 0) Desplazar índice por el número deseado de periodos con una frecuencia de tiempo opcional

Notas

Si se especifica la frecuencia, los valores del índice se desplazan pero los datos no se alinean. Es decir, use freq si desea ampliar el índice al cambiar y conservar los datos originales.

Espero poder ayudar a futuras preguntas en este asunto.