Если важна производительность, используйте numpy.argsort
для позиций отсортированных значений и получения имен столбцов путем индексации:
arr = df.columns.values[np.argsort(-(df).values)[:, :2]]
print (arr)
[['gama' 'beta']
['beta' 'gama']
['gama' 'beta']]
df1 = pd.DataFrame(arr, index=df.index).rename(columns=lambda x: f'top_{x+1}')
print (df1)
top_1 top_2
0 gama beta
1 beta gama
2 gama beta
Если производительность не важна:
df1 = pd.DataFrame([x.nlargest(2).index for _, x in df.T.items()])
print (df1)
0 1
0 gama beta
1 beta gama
2 gama beta