在pandas数据框中创建multiindex列

时间:2016-03-02 23:21:44

标签: python pandas

我有一个带有以下strcuture的pandas数据帧:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.arange(32).reshape((4,8)), 
            index = pd.date_range('2016-01-01', periods=4),
            columns=['male ; 0', 'male ; 1','male ; 2','male ; 4','female ; 0','female ; 1','female ; 2','female ; 3',])

列名称混乱,标题名称中包含两个变量的组合,以及原始电子表格中的残余标点符号。

我想要做的是在我的数据框中设置一个名为sex and age的MultiIndex列。

我尝试使用pd.MultiIndex.from_tuples这样:

columns = [('Male', 0),('Male', 1),('Male', 2),('Male', 3),('Female', 0),('Female', 1),('Female', 2),('Female', 3)]
df.columns = pd.MultiIndex.from_tuples(columns)

然后命名列索引:

df.columns.names = ['Sex', 'Age']

这给出了我想要的结果。但是,我的数据帧每个性别的年龄都超过100,所以这不太实用。

有人可以指导我如何以编程方式从元组中设置MultiIndex列。

2 个答案:

答案 0 :(得分:5)

Jaco的答案很有效,但你甚至可以使用MultiIndex直接从产品创建.from_product()

sex = ['Male', 'Female']
age = range(100)
df.columns = pd.MultiIndex.from_product([sex, age], names=['Sex', 'Age'])

答案 1 :(得分:3)

您可以使用columns模块生成import itertools max_age = 100 sex = ['Male','Female'] age = range(max_age) columns=list(itertools.product(sex, age)) df.columns = pd.MultiIndex.from_tuples(columns) df.columns.names = ['Sex', 'Age'] 变量,方法是在您的数据中采用性别和年龄范围的笛卡尔联接,例如:

{{1}}