Headers to column, pandas DataFrame

for example I have a pandas DataFrame of the test results in some class. It could look like this table:

Name English French History Math Physic Chemistry Biology
Mike 3 3 4 5 6 5 4
Tom 4 4 3 4 4 5 5
Nina 5 6 4 3 3 3 5
Anna 4 3 4 5 5 3 3
Musa 5 5 4 4 4 6 5
Maria 4 3 5 4 3 2 3
Chris 6 5 5 5 5 5 6

For every student I want to create at least two columns with the best test result and best subject. Important: every student can have more than only one best subject (the results are similar)!

For the example above it should be look like this:

Name English French History Math Physic Chemistry Biology Best result Best subject 1 Best subject 2
Mike 3 3 4 5 6 5 4 6 Physic None
Tom 4 4 3 4 4 5 5 5 Chemistry Biology
Nina 5 6 4 3 3 3 5 6 French None
Anna 4 3 4 5 5 3 3 5 Math Physic
Musa 5 5 4 4 4 6 5 6 Chemistry None
Maria 4 3 5 4 3 2 3 5 History None
Chris 6 5 5 5 5 5 6 6 English Biology

what is the best way to do it in Pandas? Thank you in advance!

what is the best way to do it in Pandas? Thank you in advance!

>Solution :

Another possible solution :

tmp = df.set_index("Name") # a DataFrame
bre = tmp.max(axis=1) # a Series

bsu = (
    ((tmp.columns + "|") @ tmp.eq(bre, axis=0).T)
        .str.strip("|").str.split("|", expand=True)
        .rename(lambda x: f"Best subject {x+1}", axis=1)
    )

out = tmp.assign(**{"Best result": bre}).join(bsu).reset_index()#.fillna("None")

Output :

Name English French History Math Physic Chemistry Biology Best result Best subject 1 Best subject 2
0 Mike 3 3 4 5 6 5 4 6 Physic
1 Tom 4 4 3 4 4 5 5 5 Chemistry Biology
2 Nina 5 6 4 3 3 3 5 6 French
3 Anna 4 3 4 5 5 3 3 5 Math Physic
4 Musa 5 5 4 4 4 6 5 6 Chemistry
5 Maria 4 3 5 4 3 2 3 5 History
6 Chris 6 5 5 5 5 5 6 6 English Biology

Leave a Reply