Вот мой пример
Пример df
Out[1378]:
A B C D
0 5 5 1 5
1 0 1 5 5
2 3 3 1 3
3 4 5 0 4
4 5 5 1 1
Шаг 1 : используйте sum
, nlargest
и столбцы срезов для Score step
df_tops = df[df.sum().nlargest(2, keep='all').index]
Out[594]:
B D
0 5 5
1 1 5
2 3 3
3 5 4
4 5 1
Шаг 2 : сравните df_tops
против max
из df_tops
, чтобы создать логический результат. наконец, sum
и наберите idxmax
на нем
finalist = df_tops.eq(df_tops.max(1), axis=0).sum().idxmax()
Out[608]: 'B'
Или вы можете использовать idxmax
и mode
для step 2
. Это возвращает серию верхнего имени столбца
finalist = df_tops.idxmax(1).mode()
Out[621]:
0 B
dtype: object
После того, как у вас есть верхний столбец, просто нарежьте его
df[finalist]
Out[623]:
B
0 5
1 1
2 3
3 5
4 5
Примечание : в случае runner-up
столбцы суммируются с одинаковым числом, шаг 2 выбирает только один столбец. Если вы хотите, чтобы он выбирал оба одинаковых столбца рейтинга / голосов, занявших второе место, вам нужно использовать nlargest
и index
вместо idxmax
, и результат будет массив
finalist = df_tops.eq(df_tops.max(1), axis=0).sum().nlargest(1, keep='all').index.values
Out[615]: array(['B'], dtype=object)