如何获取Pandas交叉表生成的多层索引的上层名称?
解决Pandas Crosstab索引相关问题
你遇到的核心问题是混淆了索引的名称和索引的实际取值:df_test2.index.names返回的是行索引的名称(即你传入crosstab的第一个参数df_test[0]的列名'0'),而你想要的应该是索引的具体取值(或关联原数据的上层标签),以下是对应解决方案:
1. 获取行索引的实际取值(排除Margins的'All')
如果需要crosstab生成的行索引里的具体值(去掉自动添加的汇总行'All'),直接提取并过滤即可:
# 提取所有行索引值转为列表 index_vals = df_test2.index.tolist() # 过滤掉'All' target_vals = [v for v in index_vals if v != 'All'] print(target_vals) # 输出: [1, 4]
2. 生成带原数据上层索引的交叉表
如果你想把原DataFramedf_test的行标签('A'、'B')作为交叉表的上层索引,需要在调用crosstab时传入原索引:
# 传入原行索引和df_test[0]作为行参数,生成多层索引交叉表 df_test2 = pd.crosstab([df_test.index, df_test[0]], df_test[1], margins=True) # 获取上层索引的名称(若原索引无名称,可先设置df_test.index.name='Category') upper_index_name = df_test2.index.names[0] # 获取上层索引的唯一取值 upper_index_vals = df_test2.index.get_level_values(0).unique().tolist() print(upper_index_vals) # 输出: ['A', 'B', 'All']
3. 若你实际需要列索引的取值
如果你的期望列表['1','2','5']是笔误(比如把列名'1'和列索引取值2、5混淆),获取列索引取值的操作类似:
col_vals = df_test2.columns.tolist() filtered_cols = [v for v in col_vals if v != 'All'] print(filtered_cols) # 输出: [2, 5]
内容的提问来源于stack exchange,提问作者Ville
相关产品推荐
相关产品推荐

