I have a pandas dataframe df containing 5 rows and 2 columns.

A   B
0   10  0
1   20  5
2   30  10
3   40  15
4   50  20

df.to_dict() returns

{'A': {0: 10, 1: 20, 2: 30, 3: 40, 4: 50},
 'B': {0: 0, 1: 5, 2: 10, 3: 15, 4: 20}}

For column A, I want to shift each item to two rows below. Instead of having nan values on top, I want to bring two elements that would be pushed out in the bottom to the top.

For column B, I want to do the opposite - shift each item to two rows above. Instead of having nan values on bottom, I want to bring two elements that would be pushed out in the top to the bottom.

I can use df["A"].shift(2) and df["B"].shift(-2). However, I get nan values.

My expected results is:

A   B
0   40  10
1   50  15
2   10  20
3   20  0
4   30  5

How can I achieve this?

1

There are 1 best solutions below

0
jezrael On BEST ANSWER

Use numpy.roll instead shift:

df['A'] = np.roll(df["A"], 2)
df['B'] = np.roll(df["B"], -2)
print (df)
    A   B
0  40  10
1  50  15
2  10  20
3  20   0
4  30   5