(You do not have duplicates of the maximum values ββin your lines, so I assume that if you have [1,1,2,2] you want to select val3 and val4 .)
One way is to use the argsort result as an index in the Series with column names.
df = df.set_index("Date") arank = df.apply(np.argsort, axis=1) ranked_cols = df.columns.to_series()[arank.values[:,::-1][:,:2]] new_frame = pd.DataFrame(ranked_cols, index=df.index)
produces
0 1 Date 1990 val4 val2 1991 val3 val4 1992 val1 val2 1993 val1 val4 1994 val2 val4 1995 val4 val3
(where I added the extra line 1995 [1,1,2,2] .)
Alternatively, you could probably melt in a flat format, select the largest two values ββin each date group, and then turn it back on.
source share