在pandas数据框中创建多级索引列

21

我有一个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和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列吗?

4个回答

23
Jaco的回答很好,但是你甚至可以使用.from_product()直接从一个乘积创建MultiIndex:
sex = ['Male', 'Female']
age = range(100)
df.columns = pd.MultiIndex.from_product([sex, age], names=['Sex', 'Age'])

8
你可以使用itertools模块通过对性别和年龄段数据进行笛卡尔积,生成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

从字典生成多级索引数据框

如果多级索引列无法通过组合操作生成,则这种方法特别方便。

>>> import pandas as pd
>>> pd.DataFrame({("Male", 0): [1, 2], ("Male", 1): [3, 4], ("Female", 0): [5, 6], ("Female", "..."): [7, 8]})
  Male    Female    
     0  1      0 ...
0    1  3      5   7
1    2  4      6   8

如果您想同时设置df的列名,请使用以下命令:
>>> import pandas as pd
>>> df = pd.DataFrame({("Male", 0): [1, 2], ("Male", 1): [3, 4], ("Female", 0): [5, 6], ("Female", "..."): [7, 8]})
>>> df.columns.names = ['Sex', 'Age']
>>> df
Sex Male    Female    
Age    0  1      0 ...
0      1  3      5   7
1      2  4      6   8

1

紧凑的一行代码

>>> import numpy as np
>>> import pandas as pd
>>> pd.DataFrame(np.arange(8).reshape((2,4)), columns=pd.MultiIndex.from_tuples([("m", 0), ("m", 1), ("f", 0), ("f", "...")], names=["sex", "age"]))
sex  m     f    
age  0  1  0 ...
0    0  1  2   3
1    4  5  6   7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接