Search code examples
pythonpython-3.xpandaspandas-groupbyfrequency

Python 3 pandas : Transform Data Frame to get levels


I am using python 3 pandas.

My data frame looks like this :

import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([['eve', "A", True],['eve', 'C', True], ['nathan', 'B', False],['eve', 'C', True], ['eric', 'C', True],['eric', 'D', True]]),
                   columns=['Name', 'Level', 'Date'])

output :

    Name    Level   Date
0   eve     A   True
1   eve     C   True
2   nathan  B   False
3   eve     C   True
4   eric    C   True
4   eric    D   True

I would like to get :

Name    Level    Date

Eve     A        True
        C        True
        C        True

eric    C        True
eric    D        True 
nathan  B        False

   

Thanks in advance


Solution

  • If you have:

    import numpy as np
    import pandas as pd
    df = pd.DataFrame(np.array([['eve', "A", True],['eve', 'C', True], ['nathan', 'B', False],['eve', 'C', True], ['eric', 'C', True]]),
                       columns=['Name', 'Level', 'Date'])
    

    You can do to order rows by the Name column:

    df.sort_values('Name')
    

    Which will give you this:

        Name    Level   Date
    4   eric    C   True
    0   eve     A   True
    1   eve     C   True
    3   eve     C   True
    2   nathan  B   False
    

    Ie in a notebook:

    enter image description here

    If you want to order rows by frequency of its content in the Name column, you can do, relying on this & this:

    sorteddf = df.assign(frequency = df.groupby('Name')['Name'].transform('count')).sort_values(by=['frequency'],ascending=False).drop('frequency',1)
    

    Giving:

    enter image description here