Swapping rows within the same pandas dataframe
Asked Answered
C

4

20

I'm trying to swap the rows within the same DataFrame in pandas.

I've tried running

a = pd.DataFrame(data = [[1,2],[3,4]], index=range(2), columns = ['A', 'B'])
b, c = a.iloc[0], a.iloc[1]
a.iloc[0], a.iloc[1] = c, b

but I just end up with both the rows showing the values for the second row (3,4).

Even the variables b and c are now both assigned to 3 and 4 even though I did not assign them again. Am I doing something wrong?

Caraviello answered 23/10, 2017 at 13:47 Comment(0)
C
19

Use a temporary varaible to store the value using .copy(), because you are changing the values while assigning them on chain i.e. Unless you use copy the data will be changed directly.

a = pd.DataFrame(data = [[1,2],[3,4]], index=range(2), columns = ['A', 'B'])
b, c = a.iloc[0], a.iloc[1]


temp = a.iloc[0].copy()
a.iloc[0] = c
a.iloc[1] = temp

Or you can directly use copy like

a = pd.DataFrame(data = [[1,2],[3,4]], index=range(2), columns = ['A', 'B'])
b, c = a.iloc[0].copy(), a.iloc[1].copy()
a.iloc[0],a.iloc[1] = c,b
Chaldean answered 23/10, 2017 at 13:52 Comment(2)
Oh yes this solved the problem. Many thanks! I'm still unsure about when values are on a chain. Would you say that it would be safer to just always use the .copy() method when I am assigning new variables?Caraviello
Yes by default they hold the reference to main object . Whatever changes you do will reflect on main object. So u need copy.Chaldean
O
12

The accepted answer does not make changes the index name.

If you only want to alter the order of rows you should use dataframe.reindex(arraylike). Notice that the index has changed.

enter image description here

Overword answered 15/11, 2020 at 6:10 Comment(1)
Yes, using .reindex() is the one.Vapor
N
5

In this way, it can be extrapolated to more complex situations:

a = pd.DataFrame(data = [[1,2],[3,4]], index=range(2), columns = ['A', 'B'])
rows = a.index.to_list()
# Move the last row to the first index
rows = rows[-1:]+rows[:-1]
a=a.loc[rows]
Nonie answered 1/3, 2019 at 4:46 Comment(0)
B
3
df = pd.DataFrame(data = [[1,2],[4,5],[6,7]], index=['a','b','c'], columns = ['A', 'B'])

df

Original DataFrame

df.reindex(['a','c','b'])

enter image description here

Billups answered 2/3, 2021 at 12:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.