我有以下熊猫数据框(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
迭代,但是我没有找到任何方法。
有人知道如何实现这一目标吗?
非常感谢!
答案 0 :(得分:2)
使用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