Turn Pandas Multi-Index into column

后端 未结 5 1980
天涯浪人
天涯浪人 2020-11-29 16:52

I have a dataframe with 2 index levels:

                         value
Trial    measurement
    1              0        13
                   1         3
            


        
相关标签:
5条回答
  • 2020-11-29 17:05

    The reset_index() is a pandas DataFrame method that will transfer index values into the DataFrame as columns. The default setting for the parameter is drop=False (which will keep the index values as columns).

    All you have to do add .reset_index(inplace=True) after the name of the DataFrame:

    df.reset_index(inplace=True)  
    
    0 讨论(0)
  • 2020-11-29 17:10

    As @cs95 mentioned in a comment, to drop only one level, use:

    df.reset_index(level=[...])

    This avoids having to redefine your desired index after reset.

    0 讨论(0)
  • 2020-11-29 17:13

    I ran into Karl's issue as well. I just found myself renaming the aggregated column then resetting the index.

    df = pd.DataFrame(df.groupby(['arms', 'success'])['success'].sum()).rename(columns={'success':'sum'})
    

    df = df.reset_index()
    

    0 讨论(0)
  • 2020-11-29 17:14

    This doesn't really apply to your case but could be helpful for others (like myself 5 minutes ago) to know. If one's multindex have the same name like this:

                             value
    Trial        Trial
        1              0        13
                       1         3
                       2         4
        2              0       NaN
                       1        12
        3              0        34 
    

    df.reset_index(inplace=True) will fail, cause the columns that are created cannot have the same names.

    So then you need to rename the multindex with df.index = df.index.set_names(['Trial', 'measurement']) to get:

                               value
    Trial    measurement       
    
        1              0        13
        1              1         3
        1              2         4
        2              0       NaN
        2              1        12
        3              0        34 
    

    And then df.reset_index(inplace=True) will work like a charm.

    I encountered this problem after grouping by year and month on a datetime-column(not index) called live_date, which meant that both year and month were named live_date.

    0 讨论(0)
  • 2020-11-29 17:20

    There may be situations when df.reset_index() cannot be used (e.g., when you need the index, too). In this case, use index.get_level_values() to access index values directly:

    df['Trial'] = df.index.get_level_values(0)
    df['measurement'] = df.index.get_level_values(1)
    

    This will assign index values to individual columns and keep the index.

    See the docs for further info.

    0 讨论(0)
提交回复
热议问题