Home > Back-end >  Creating column of rankings without resetting index
Creating column of rankings without resetting index

Time:01-31

I have a dataframe:

df = pd.DataFrame([['Jim', 93, 87, 66], ['Bob', 88, 90, 65], ['Joe', 72, 100, 70]], columns=['Name', 'Overall', 'Stopping', 'Playing'])

I want to create a dataframe such that each subject has a ranking out of 3 according to their score on Overall, Stopping, Playing.

This is the desired output:

df_ranked

Name  Overall  Stopping  Playing
 Jim        1         3        2
 Bob        2         1        3
 Joe        3         2        1

I believe this can be done by sorting the dataframe by each column "ascending", resetting the index, then creating column of index values.

Is it possible to approach this another way?

CodePudding user response:

You're looking for pandas.DataFrame.rank :

to_skip = ["Name"] # <- add here more columns, if needed

df_ranked = df.set_index(to_skip).rank(ascending=False, method="min").reset_index()

Output :

print(df_ranked)

  Name  Overall  Stopping  Playing
0  Jim      1.0       3.0      2.0
1  Bob      2.0       2.0      3.0
2  Joe      3.0       1.0      1.0

CodePudding user response:

Same answer as @Timeless using rank but showing how you can select which columns to rank and editing your df in place instead of creating a new table

#select columns for ranking
rank_cols = ['Overall', 'Stopping', 'Playing']

#rank those columns in reverse order as ints and assign back into the df
df[rank_cols] = df[rank_cols].rank(ascending=False).astype(int)
  • Related