Добавить столбец на подуровне на основе положения другого столбца подуровня - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть следующие панды Dataframe (df):

quarters = ['first_q', 'second_q', 'third_q', 'fourth_q']
columns = pd.MultiIndex.from_product([quarters, ['points']])
df = pd.DataFrame([[5, 13, 6, 12], [7,5,5,14], [3,0,7,4]], index=['curry', 'lebron','stockton'], columns=columns)

Out[]:
         first_q   second_q    third_q    fourth_q
          points     points     points      points
curry       5          13          6          12
lebron      7           5          5          14
stockton    3           0          7           4

Я хотел бы создать новый столбец на уровне 1 (рядом с «точками»), содержащий рейтинг каждого игрока (индекс)аннотации (столбец, уровень 1 «точки») в каждом квартале (столбец, уровень 0).Другими словами, ожидаемый результат:

          first_q         second_q        third_q        fourth_q
       points ranking  points ranking  points ranking  points ranking
curry     5      2       13      1       6       2       12     2
lebron    7      1        5      2       5       3       14     1
stockton  3      3        0      3       7       1        4     3

Столбец ranking level-1 в столбце first_q level-0 означает, что lebron набрал наибольшее количество очков в первом квартале, а затемна curry и stockton закончилась эта четверть на третьем месте.

Мне удалось достичь этого результата с помощью следующего кода:

for quarter in quarters:
    df = df.sort_values([(quarter, 'points')], ascending=False)
    df.loc[:,(quarter,'ranking')] = np.arange(1, 4)
df = df[quarters]
df = df.reindex(['curry', 'lebron', 'stockton'])

Однако я пытался найти более элегантный / идиоматический способ достижения этого без итерации forquarters, но я не нашел ни одного.

Кто-нибудь знает, как этого добиться?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 31 декабря 2018

Используйте rank и concat:

v = ((len(df) + 1 - df.rank(method='dense'))
        .rename({'points':'rank'}, axis=1)
        .astype(int))

pd.concat([df, v], axis=1).sort_index(axis=1)

         first_q      fourth_q      second_q      third_q     
          points rank   points rank   points rank  points rank
curry          5    2       12    2       13    1       6    2
lebron         7    1       14    1        5    2       5    3
stockton       3    3        4    3        0    3       7    1
...