Как вычислить групповые средства в DataFrame pandas при группировке по рейтингу?Python

Программы на Python
Ответить
Anonymous
 Как вычислить групповые средства в DataFrame pandas при группировке по рейтингу?

Сообщение Anonymous »

Я хотел бы создать DataFrame с датами в качестве индексов, рангами в виде столбцов и значениями, полученными из оценок. Поскольку метод ранжирования гарантирует уникальность, я полагаю, что могу расплавить/отбросить/повернуть, чтобы получить то, что хочу.
Однако этот подход кажется хрупким, и я не уверен, что бы я делал, если бы у меня были неуникальные значения ранга.
Вот постановка проблемы:

Код: Выделить всё

import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
dates = pd.date_range('2024-08-01', '2024-08-07')
contestants = ['Alligator', 'Beryl', 'Chupacabra', 'Dandelion', 'Eggplant', 'Feldspar']

random_scores = rng.random(len(dates) * len(contestants))
random_scores = random_scores.reshape((len(dates), len(contestants)))
scores = pd.DataFrame(random_scores, dates, contestants)
scores.index.name = 'DATE'
scores.columns.name = 'CONTESTANT'
ranks = scores.rank(axis=1, method='first', ascending=False)
top3_ranks = ranks.where(ranks >> scores
CONTESTANT  Alligator     Beryl  Chupacabra  Dandelion  Eggplant  Feldspar
DATE
2024-08-01   0.773956  0.438878    0.858598   0.697368  0.094177  0.975622
2024-08-02   0.761140  0.786064    0.128114   0.450386  0.370798  0.926765
2024-08-03   0.643865  0.822762    0.443414   0.227239  0.554585  0.063817
2024-08-04   0.827631  0.631664    0.758088   0.354526  0.970698  0.893121
2024-08-05   0.778383  0.194639    0.466721   0.043804  0.154289  0.683049
2024-08-06   0.744762  0.967510    0.325825   0.370460  0.469556  0.189471
2024-08-07   0.129922  0.475705    0.226909   0.669814  0.437152  0.832678

>>> top3_ranks
CONTESTANT  Alligator  Beryl  Chupacabra  Dandelion  Eggplant  Feldspar
DATE
2024-08-01        3.0    NaN         2.0        NaN       NaN       1.0
2024-08-02        3.0    2.0         NaN        NaN       NaN       1.0
2024-08-03        2.0    1.0         NaN        NaN       3.0       NaN
2024-08-04        3.0    NaN         NaN        NaN       1.0       2.0
2024-08-05        1.0    NaN         3.0        NaN       NaN       2.0
2024-08-06        2.0    1.0         NaN        NaN       3.0       NaN
2024-08-07        NaN    3.0         NaN        2.0       NaN       1.0
Вот что я пробовал:

Код: Выделить всё

melted_scores = scores.T.melt(value_name='SCORE')
melted_ranks = top3_ranks.T.melt(value_name='RANK')
melted_scores['RANK'] = melted_ranks['RANK']
desired_output = melted_scores.dropna().pivot(columns='RANK', index='DATE', values='SCORE')

Код: Выделить всё

>>> desired_output
RANK             1.0       2.0       3.0
DATE
2024-08-01  0.975622  0.858598  0.773956
2024-08-02  0.926765  0.786064  0.761140
2024-08-03  0.822762  0.643865  0.554585
2024-08-04  0.970698  0.893121  0.827631
2024-08-05  0.778383  0.683049  0.466721
2024-08-06  0.967510  0.744762  0.469556
2024-08-07  0.832678  0.669814  0.475705
Есть ли лучший способ сделать это, который также может обрабатывать неуникальные значения ранга?

Подробнее здесь: https://stackoverflow.com/questions/796 ... by-ranking
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»