Pandas如何为多层列索引新增子层存储原始值与rank结果
实现代码
import pandas as pd # 复现初始两层列索引DataFrame df = pd.DataFrame( data=[[1, 3], [2, 4]], columns=pd.MultiIndex.from_arrays( [['var', 'var'], ['var1', 'var2']] ) ) # 1. 为原始数据列追加第三层索引标签'mean',自动适配列数量 mean_cols = pd.MultiIndex.from_arrays([ df.columns.get_level_values(0), df.columns.get_level_values(1), ['mean'] * len(df.columns) ]) df_mean = df.copy() df_mean.columns = mean_cols # 2. 计算列内排名,为排名结果追加第三层索引标签'rank' # pct=True 对应示例中给出的0.5、1的百分比排名值,如需默认整数排名可去掉该参数 df_rank = df.rank(pct=True) rank_cols = pd.MultiIndex.from_arrays([ df_rank.columns.get_level_values(0), df_rank.columns.get_level_values(1), ['rank'] * len(df_rank.columns) ]) df_rank.columns = rank_cols # 3. 沿列方向拼接后按列索引排序,保证同一二级列下的mean、rank子列相邻 result = pd.concat([df_mean, df_rank], axis=1).sort_index(axis=1)
最终输出效果
运行代码后result的结构完全匹配预期:
var var1 var2 mean rank mean rank 0 1 0.5 3 0.5 1 2 1.0 4 1.0
说明:如果不需要百分比排名,仅需将
df.rank(pct=True)改为df.rank(),即可得到默认的从1开始的整数排名结果。
内容的提问来源于stack exchange,提问作者Mustard Tiger
相关产品推荐
相关产品推荐

