Você já está no caminho certo, o que complica é as companhias se repetirem, força a gente a criar agrupamentos que acaba aumentando a complexidade um pouco.
Olha se esse código funciona:
# imports
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# Essas 3 linhas são para somar o faturamento baseado no nome da companhia
# a gente modifica o index para que o "Total Value" seja retornado corretamente para cada companhia já que estamos agrupando para somar o "Value"
dados.set_index('Company', inplace=True)
dados['Total Value'] = dados.groupby('Company').sum()['Value']
dados.reset_index(inplace=True)
# Variável que representa o último ano móvel
last_year = datetime.now() - timedelta(days=365)
# Criação do ranking
# o legal é que mesmo com uma seleção menor que o DataFrame ele ainda cria a Series Rank para as companhias corretas e coloca o resto como NaN
dados['Rank'] = dados[dados['Date'] > last_year]['Total Value'].rank(ascending=False, method='dense')
# Aplica os nomes definidos para o top 4
dados['Top 4 Last Year'] = dados['Rank'].apply(lambda x: x if (x <= 4 or np.isnan(x)) else 'Outras')
# Aplica os nomes definidos para o top 5
dados['Top 5 Last Year'] = dados['Rank'].apply(lambda x: x if (x <= 4 or np.isnan(x)) else 5)
dados['Top 5 Last Year'] = dados['Top 5 Last Year'].apply(lambda x: x if np.isnan(x) else str(int(x)) + 'º')
dados
Espero ter ajudado, se tiver alguma dúvida é só perguntar!