Search code examples
pythonpandasdataframeindexingrow

Python Dataframes: Data Column Being Read in As Row Index Mistakenly and reset_index() Produces Wrong Output


I currently have a dataframe called df and it's sample output is below:

enter image description here

I believe the Name column is being read in as the row index which I don't want. My desired dataframe would look like this:

enter image description here

As such, I tried the following code:

df = df.reset_index()

But the output is wrong ... it looks like this:

enter image description here

How can I get my desired df output?


Solution

  • Your dataframe:

    >>> df
    Name    Score    Age Address
    Abbott  value  value   value
    Aaron   value  value   value
    Johnny  value  value   value
    Paul    value  value   value
    Sam     value  value   value
    

    Check row and column indexes:

    >>> df.index
    Index(['Abbott', 'Aaron', 'Johnny', 'Paul', 'Sam'], dtype='object')
    
    >>> df.columns
    Index(['Score', 'Age', 'Address'], dtype='object', name='Name')
    

    As you can see, Name is not the index name but the name of the data columns:

    >>> print(df.index.name)
    None
    
    >>> print(df.columns.named)
    Name
    

    Now swap the names:

    >>> df.index.name, df.columns.name = df.columns.name, df.index.name
    
    >>> print(df.index.name)
    Name
    
    >>> print(df.columns.name)
    None
    
    >>> df
            Score    Age Address
    Name                           # <- name of data index
    Abbott  value  value   value
    Aaron   value  value   value
    Johnny  value  value   value
    Paul    value  value   value
    Sam     value  value   value
    
    >>> df.reset_index()
         Name  Score    Age Address
    0  Abbott  value  value   value
    1   Aaron  value  value   value
    2  Johnny  value  value   value
    3    Paul  value  value   value
    4     Sam  value  value   value
    

    To fix it, @QuangHoang suggested you:

    >>> df.rename_axis(columns=None, index='Name').reset_index()
         Name  Score    Age Address
    0  Abbott  value  value   value
    1   Aaron  value  value   value
    2  Johnny  value  value   value
    3    Paul  value  value   value
    4     Sam  value  value   value