如何基于列名规则为含行MultiIndex的Pandas DataFrame创建列MultiIndex
Pandas行MultiIndex DataFrame转换为行列双MultiIndex结构
初始DataFrame
我们从一个仅行级为MultiIndex的DataFrame开始,代码如下:
import numpy as np import pandas as pd arrays = [np.array(["berlin", "berlin", "paris", "paris", "rome", "rome", "seville", "seville"]), np.array(["one", "two", "one", "two", "one", "two", "one", "two"])] df = pd.DataFrame(np.random.randn(8, 4), index=arrays, columns=['mike','ana','manu','analia'])
转换要求
需要将上述DataFrame转换为同时包含列级MultiIndex的结构,列的层级归属由以下函数判定:
def sortit(colname): if colname.startswith('m'): return 'm' else: # 修正原函数重复判断的逻辑错误 return 'a'
实现方案
直接一次性创建列级MultiIndex,避免重复调用耗时的判定逻辑,代码如下:
import numpy as np import pandas as pd # 保留原行级MultiIndex并添加名称 arrays = [np.array(["berlin", "berlin", "paris", "paris", "rome", "rome", "seville", "seville"]), np.array(["one", "two", "one", "two", "one", "two", "one", "two"])] tuples_i = list(zip(*arrays)) index_rows = pd.MultiIndex.from_tuples(tuples_i, names=["city", "number"]) # 基于判定逻辑生成列级MultiIndex的层级数据 dept_level = [sortit(col) for col in df.columns] name_level = df.columns.tolist() # 创建列级MultiIndex tuples_c = list(zip(dept_level, name_level)) index_columns = pd.MultiIndex.from_tuples(tuples_c, names=["department", "name"]) # 生成目标DataFrame(复用原数据而非重新生成随机数) df = pd.DataFrame(df.values, index=index_rows, columns=index_columns) print(df)
注:代码中复用了原DataFrame的原始数据,而非重新生成随机数,更贴合实际转换场景。
关键注意事项
- 初始状态固定为仅行级含MultiIndex的DataFrame,不可更改;
- 实际场景中列层级判定逻辑复杂且耗时,必须一次性构建列MultiIndex,避免重复计算,提升后续查询性能。
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

