heads pd.sort_values
сортирует по умолчанию в порядке возрастания, поэтому, когда вы берете head(10)
, это на самом деле худшие 10, если мы рассмотрим естественное упорядочение действительных чисел.
Теперь для вашей проблемы, вот решение
Сначала нам нужно создать несколько столбцов для определения недели года (rtbins переименован в df):
df['year'] = df['pricedate'].apply(lambda x: x.year)
df['week'] = df['pricedate'].apply(lambda x: x.isocalendar()[1])
Затем мы сгруппируем данные по ['year', 'week', 'cons_name']
:
df2 = df.groupby(['year', 'week', 'cons_name'], as_index=False).aggregate(np.mean)
Теперь вы должны получить фрейм данных, в котором для каждого (года, недели) у вас есть только одна запись имени cons_name со средней тенью.
Тогда мы возьмем топ-10 для каждого (год, неделя)
def udf(df):
return df.sort_values('shadow').head(10)
df2.groupby(['year', 'week'], as_index=False).apply(udf)
Это должно дать вам желаемый результат.