How to change the order of DataFrame columns?

前端 未结 30 1602
南旧
南旧 2020-11-22 01:24

I have the following DataFrame (df):

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))
相关标签:
30条回答
  • 2020-11-22 02:14

    set():

    A simple approach is using set(), in particular when you have a long list of columns and do not want to handle them manually:

    cols = list(set(df.columns.tolist()) - set(['mean']))
    cols.insert(0, 'mean')
    df = df[cols]
    
    0 讨论(0)
  • 2020-11-22 02:14

    I liked Shoresh's answer to use set functionality to remove columns when you don't know the location, however this didn't work for my purpose as I need to keep the original column order (which has arbitrary column labels).

    I got this to work though by using IndexedSet from the boltons package.

    I also needed to re-add multiple column labels, so for a more general case I used the following code:

    from boltons.setutils import IndexedSet
    cols = list(IndexedSet(df.columns.tolist()) - set(['mean', 'std']))
    cols[0:0] =['mean', 'std']
    df = df[cols]
    

    Hope this is useful to anyone searching this thread for a general solution.

    0 讨论(0)
  • 2020-11-22 02:17

    How about:

    df.insert(0, 'mean', df.mean(1))
    

    http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion

    0 讨论(0)
  • 2020-11-22 02:18

    I believe @Aman's answer is the best if you know the location of the other column.

    If you don't know the location of mean, but only have its name, you cannot resort directly to cols = cols[-1:] + cols[:-1]. Following is the next-best thing I could come up with:

    meanDf = pd.DataFrame(df.pop('mean'))
    # now df doesn't contain "mean" anymore. Order of join will move it to left or right:
    meanDf.join(df) # has mean as first column
    df.join(meanDf) # has mean as last column
    
    0 讨论(0)
  • 2020-11-22 02:19

    You could do the following (borrowing parts from Aman's answer):

    cols = df.columns.tolist()
    cols.insert(0, cols.pop(-1))
    
    cols
    >>>['mean', 0L, 1L, 2L, 3L, 4L]
    
    df = df[cols]
    
    0 讨论(0)
  • 2020-11-22 02:19

    Moving any column to any position:

    import pandas as pd
    df = pd.DataFrame({"A": [1,2,3], 
                       "B": [2,4,8], 
                       "C": [5,5,5]})
    
    cols = df.columns.tolist()
    column_to_move = "C"
    new_position = 1
    
    cols.insert(new_position, cols.pop(cols.index(column_to_move)))
    df = df[cols]
    
    0 讨论(0)
提交回复
热议问题