Вот подход. У меня нет полного фрейма данных, поэтому тест проводится только с теми, которые показаны в вопросе.
Часть вопроса pandas может быть решена путем назначения последнего шага переменной, а затем запроса для стратегий этого шага, а затем получить наибольшее число.
Чтобы найти дескрипторы, мы запрашиваем у matplotlib все сгенерированные им дескрипторы и метки. Затем мы ищем каждую из стратегий в списке меток, взяв ее индекс, чтобы получить соответствующий дескриптор.
Обратите внимание, что «count» - раздражающее имя для столбца. Это также имя функции pandas, которая запрещает ее использование в точечной записи.
import pandas as pd
from matplotlib import pyplot as plt
df = pd.DataFrame(columns=['step', 'strategy', 'count', 'score'],
data=[[0, 'CC', 34, 2.08],
[0, 'DD', 1143, 2.18],
[0, 'CD', 1261, 2.24],
[0, 'DC', 62, 2.07],
[1, 'CC', 6, 1.88],
[106, 'DDCC', 56, 0.99],
[106, 'DD', 765, 1.00],
[106, 'DC', 1665, 1.31],
[106, 'DCDC', 23, 1.60],
[106, 'DDDD', 47, 0.98]])
last_step = df.step.max()
strategies_last_step = df.strategy[df['count'][df.step == last_step].nlargest(4).index]
df1 = df.set_index('step')
df1.groupby('strategy')['count'].plot()
plt.ylabel('count')
plt.xlabel('step')
plt.title('Count of all strategies by step')
handles, labels = plt.gca().get_legend_handles_labels()
selected_handles = [handles[labels.index(strategy)] for strategy in strategies_last_step]
legend = plt.legend(handles=selected_handles, loc='best')
plt.show()