如何将MultiIndex某层级的字符串拆分以新增层级?
问题描述
我想要使用分隔符拆分MultiIndex中某一层级的字符串值,从而在MultiIndex中新增一个层级。
我的原始DataFrame如下:
import pandas as pd import numpy as np from functools import reduce pd.DataFrame( np.ones((5, 4)), columns=pd.MultiIndex.from_tuples( zip( list(reduce(lambda x, y: f"{x}_{y}", tup) for tup in zip(range(4), range(4))), list(map(str, range(4))), ) ), index=range(5), )
原始表格输出:
| ('0_0', '0') | ('1_1', '1') | ('2_2', '2') | ('3_3', '3') | |
|---|---|---|---|---|
| 0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2 | 1.0 | 1.0 | 1.0 | 1.0 |
| 3 | 1.0 | 1.0 | 1.0 | 1.0 |
| 4 | 1.0 | 1.0 | 1.0 | 1.0 |
我该如何高效地使用_分隔符拆分第0层级,使我的MultiIndex列变为3个层级?预期效果如下:
| (0, 0, 0) | (1, 1, 1) | (2, 2, 2) | (3, 3, 3) | |
|---|---|---|---|---|
| 0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1 | 1.0 | 1.0 | 1.0 | 1.0 |
| 2 | 1.0 | 1.0 | 1.0 | 1.0 |
| 3 | 1.0 | 1.0 | 1.0 | 1.0 |
| 4 | 1.0 | 1.0 | 1.0 | 1.0 |
不知道如何在Markdown表格中设置多个表头,元组的长度代表层级数。这是
pd.DataFrame.to_markdown的输出结果
解决方案
直接通过拆分目标层级并重组MultiIndex即可实现,以下是两种高效写法:
写法一:遍历重组
适合需要自定义处理每个元素的场景:
import pandas as pd import numpy as np from functools import reduce # 构建原始DataFrame df = pd.DataFrame( np.ones((5, 4)), columns=pd.MultiIndex.from_tuples( zip( list(reduce(lambda x, y: f"{x}_{y}", tup) for tup in zip(range(4), range(4))), list(map(str, range(4))), ) ), index=range(5), ) # 遍历列索引,拆分第0层并重组为三元组 new_columns = [] for col_tuple in df.columns: split_part = col_tuple[0].split('_') # 拼接成新的三层索引,按需转换数据类型 new_tuple = (int(split_part[0]), int(split_part[1]), int(col_tuple[1])) new_columns.append(new_tuple) # 更新列索引 df.columns = pd.MultiIndex.from_tuples(new_columns)
写法二:向量化处理
更高效的批量处理方式,适合大数据量场景:
# 拆分第0层为两个新列 split_level0 = df.columns.get_level_values(0).str.split('_', expand=True).astype(int) # 拼接原第1层,生成新的三层MultiIndex new_columns = pd.MultiIndex.from_arrays([ split_level0[0], split_level0[1], df.columns.get_level_values(1).astype(int) ]) # 更新列索引 df.columns = new_columns
两种方法都能将原二级列索引转换为三级,达到预期效果。
内容的提问来源于stack exchange,提问作者Stalin Thomas
相关产品推荐
相关产品推荐

