pythonpandasmovedataframeshift

Move column by name to front of table in pandas


Here is my df:

                             Net   Upper   Lower  Mid  Zsore
Answer option                                                
More than once a day          0%   0.22%  -0.12%   2    65 
Once a day                    0%   0.32%  -0.19%   3    45
Several times a week          2%   2.45%   1.10%   4    78
Once a week                   1%   1.63%  -0.40%   6    65

How can I move a column by name ("Mid") to the front of the table, index 0. This is what the result should look like:

                             Mid   Upper   Lower  Net  Zsore
Answer option                                                
More than once a day          2   0.22%  -0.12%   0%    65 
Once a day                    3   0.32%  -0.19%   0%    45
Several times a week          4   2.45%   1.10%   2%    78
Once a week                   6   1.63%  -0.40%   1%    65

My current code moves the column by index using df.columns.tolist() but I'd like to shift it by name.


Solution

  • We can use loc to reorder by passing a list:

    In [27]:
    # get a list of columns
    cols = list(df)
    # move the column to head of list using index, pop and insert
    cols.insert(0, cols.pop(cols.index('Mid')))
    cols
    Out[27]:
    ['Mid', 'Net', 'Upper', 'Lower', 'Zsore']
    In [28]:
    # use ix to reorder
    df = df.loc[:, cols]
    df
    Out[28]:
                          Mid Net  Upper   Lower  Zsore
    Answer_option                                      
    More_than_once_a_day    2  0%  0.22%  -0.12%     65
    Once_a_day              3  0%  0.32%  -0.19%     45
    Several_times_a_week    4  2%  2.45%   1.10%     78
    Once_a_week             6  1%  1.63%  -0.40%     65
    

    Another method is to take a reference to the column and reinsert it at the front:

    In [39]:
    mid = df['Mid']
    df.drop(labels=['Mid'], axis=1,inplace = True)
    df.insert(0, 'Mid', mid)
    df
    Out[39]:
                          Mid Net  Upper   Lower  Zsore
    Answer_option                                      
    More_than_once_a_day    2  0%  0.22%  -0.12%     65
    Once_a_day              3  0%  0.32%  -0.19%     45
    Several_times_a_week    4  2%  2.45%   1.10%     78
    Once_a_week             6  1%  1.63%  -0.40%     65
    

    You can, with very early versions of Pandas, also use ix to achieve the same results:

    df = df.ix[:, cols]
    

    But ix was deprecated from pandas 0.20.0 onwards and was discontinued as of Pandas 1.0.