Shift column in pandas dataframe up by one?

PythonPandasDataframe

Python Problem Overview


I've got a pandas dataframe. I want to 'lag' one of my columns. Meaning, for example, shifting the entire column 'gdp' up by one, and then removing all the excess data at the bottom of the remaining rows so that all columns are of equal length again.

df =
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7

df_lag =
    y  gdp  cap
0   1    3    5
1   2    7    9
2   8    4    2
3   3    7    7

Anyway to do this?

Python Solutions


Solution 1 - Python

In [44]: df['gdp'] = df['gdp'].shift(-1)

In [45]: df
Out[45]: 
   y  gdp  cap
0  1    3    5
1  2    7    9
2  8    4    2
3  3    7    7
4  6  NaN    7

In [46]: df[:-1]                                                                                                                                                                                                                                                                                                               
Out[46]: 
   y  gdp  cap
0  1    3    5
1  2    7    9
2  8    4    2
3  3    7    7

Solution 2 - Python

shift column gdp up:

df.gdp = df.gdp.shift(-1)

and then remove the last row

Solution 3 - Python

To easily shift by 5 values for example and also get rid of the NaN rows, without having to keep track of the number of values you shifted by:

d['gdp'] = df['gdp'].shift(-5)
df = df.dropna()

Solution 4 - Python

Time is going. And current Pandas documentation recommend this way:

 df.loc[:, 'gdp'] = df.gdp.shift(-1)

Solution 5 - Python

df.gdp = df.gdp.shift(-1) ## shift up
df.gdp.drop(df.gdp.shape[0] - 1,inplace = True) ## removing the last row

Solution 6 - Python

First shift the column:

df['gdp'] = df['gdp'].shift(-1)

Second remove the last row which contains an NaN Cell:

df = df[:-1]

Third reset the index:

df = df.reset_index(drop=True)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionnatsuki_2002View Question on Stackoverflow
Solution 1 - PythonWouter OvermeireView Answer on Stackoverflow
Solution 2 - PythonPeacefulBYView Answer on Stackoverflow
Solution 3 - PythonArmandduPlessisView Answer on Stackoverflow
Solution 4 - PythonVasyl KolomietsView Answer on Stackoverflow
Solution 5 - PythonBilal MahmoodView Answer on Stackoverflow
Solution 6 - PythonJonas FreireView Answer on Stackoverflow