Home > Mobile >  sort grade letters within pandas groupby
sort grade letters within pandas groupby

Time:08-19

I have a df and upon groupby

df.groupby(['Gender', 'Scored Grade']).size().reset_index()

I get

    Gender  Scored Grade    0
0   Female  A-  1
1   Female  B   4
2   Female  B   4
3   Female  B-  9
4   Female  C   3
5   Female  C   4
6   Male    B   8
7   Male    B   4
8   Male    B-  9
9   Male    C   5
10  Male    C   8
11  Male    C-  1

I want to sort grade letters and thus tried this method after some searching here.

df.sort_values("Scored Grade", ascending=False,
 key=lambda x: (x[0], - x.endswith(' ')   x.endswith('-'))).groupby(['Gender', 'Scored Grade']).size().reset_index()

but it gave me an error

AttributeError: 'Series' object has no attribute 'endswith'

I also tried this method

def particular_sort(series):
    """
    Must return one Series
    """
    return series.apply(lambda x: (x[0], - x.endswith(' ')   x.endswith('-')))


df2 = df.groupby(['Gender', 'Scored Grade']).size().reset_index()
df2.loc[df2["Gender"] == "Male"].sort_values("Gender", key=particular_sort)

but it did not work,

I want to sort grade letters within each group of gender so as B > B > B-, etc.

CodePudding user response:

We could do pd.Categorical with input grade

import itertools 
cate = list(map(''.join,itertools.product(list('ABCD'),[' ','','-'])))
cate
Out[958]: ['A ', 'A', 'A-', 'B ', 'B', 'B-', 'C ', 'C', 'C-', 'D ', 'D', 'D-']
df['Scored Grade'] = pd.Categorical(df['Scored Grade'], cate)
df = df.sort_values('Scored Grade')
out = df.value_counts(['Gender', 'Scored Grade'])
  • Related