根据另一个子级列的位置在子级添加一列

时间:2018-12-31 17:29:14

标签: python pandas multi-index

我有以下熊猫数据框(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级(“积分”旁边)创建一个新列,其中包含每个季度(第0级,列)每个玩家(索引)注释(列,等级1“点”)的排名。换句话说,预期结果是:

          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级别0列中的first_q级别1列意味着lebron在第一季度中得分最高,其次是curry和{{ 1}}在该季度末排名第三。

我已通过以下代码设法实现了这一目标:

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']) 上进行for迭代,但是我没有找到任何方法。

有人知道如何实现这一目标吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

使用rankconcat

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