6种方式创建多层索引MultiIndex
pd.MultiIndex即具有多个层次的索引。通过多层次索引,我们就可以操作整个索引组的数据。本文主要介绍在Pandas中创建多层索引的6种方式:
- pd.MultiIndex.from_arrays():多维数组作为参数,高维指定高层索引,低维指定低层索引。
- pd.MultiIndex.from_tuples():元组的列表作为参数,每个元组指定每个索引(高维和低维索引)。
- pd.MultiIndex.from_product():一个可迭代对象的列表作为参数,根据多个可迭代对象元素的笛卡尔积(元素间的两两组合)进行创建索引。
- pd.MultiIndex.from_frame:根据现有的数据框来直接生成
- groupby():通过数据分组统计得到
- pivot_table():生成透视表的方式来得到
pd.MultiIndex.from_arrays()
In [1]:
1 | import pandas as pd |
通过数组的方式来生成,通常指定的是列表中的元素:
In [2]:
1 | # 列表元素是字符串和数字 |
Out[2]:
1 | MultiIndex([('xiaoming', 22), |
In [3]:
1 | type(m1) # 查看数据类型 |
通过type函数来查看数据类型,发现的确是:MultiIndex
Out[3]:
1 | pandas.core.indexes.multi.MultiIndex |
在创建的同时可以指定每个层级的名字:
In [4]:
1 | # 列表元素全是字符串 |
Out[4]:
1 | MultiIndex([('xiaoming', 'male'), |
下面的例子是生成3个层次的索引且指定名字:
In [5]:
1 | array3 = [["xiaoming","guanyu","zhangfei"], |
Out[5]:
1 | MultiIndex([('xiaoming', 'male', 22), |
pd.MultiIndex.from_tuples()
通过元组的形式来生成多层索引:
In [6]:
1 | # 元组的形式 |
Out[6]:
1 | MultiIndex([('xiaoming', 22), |
In [7]:
1 | # 元组构成的3层索引 |
Out[7]:
1 | MultiIndex([('xiaoming', 'male', 22), |
列表和元组是可以混合使用的:
- 最外层是列表
- 里面全部是元组
In [8]:
1 | array6 = [("xiaoming","guanyu","zhangfei"), |
Out[8]:
1 | MultiIndex([('xiaoming', 'male', 18), |
pd.MultiIndex.from_product()
使用可迭代对象的列表作为参数,根据多个可迭代对象元素的笛卡尔积(元素间的两两组合)进行创建索引。
在Python中,我们使用 isinstance()
函数 判断python对象是否可迭代:
1 | # 导入 collections 模块的 Iterable 对比对象 |
通过上面的例子我们总结:常见的字符串、列表、集合、元组、字典都是可迭代对象
下面举例子来说明:
In [18]:
1 | names = ["xiaoming","guanyu","zhangfei"] |
Out[18]:
1 | MultiIndex([('xiaoming', 22), |
In [19]:
1 | # 需要展开成列表形式 |
Out[19]:
1 | MultiIndex([('a', 1), |
In [20]:
1 | # 使用元组形式 |
Out[20]:
1 | MultiIndex([('a', 1), |
In [21]:
1 | # 使用range函数 |
Out[21]:
1 | MultiIndex([('a', 0), |
In [22]:
1 | # 使用range函数 |
总个数是``332=18`个:
Out[22]:
1 | MultiIndex([('a', 0, 'x'), |
pd.MultiIndex.from_frame()
通过现有的DataFrame直接来生成多层索引:
1 | df = pd.DataFrame({"name":["xiaoming","guanyu","zhaoyun"], |
直接生成了多层索引,名字就是现有数据框的列字段:
In [24]:
1 | pd.MultiIndex.from_frame(df) |
Out[24]:
1 | MultiIndex([('xiaoming', 23, 'male'), |
通过names参数来指定名字:
In [25]:
1 | # 可以自定义名字 |
Out[25]:
1 | MultiIndex([('xiaoming', 23, 'male'), |
groupby()
通过groupby函数的分组功能计算得到:
In [26]:
1 | df1 = pd.DataFrame({"col1":list("ababbc"), |
Out[26]:
1 | df2 = df1.groupby(["col1","col2"]).agg({"number1":sum, |
查看数据的索引:
In [28]:
1 | df2.index |
Out[28]:
1 | MultiIndex([('a', 'x'), |
pivot_table()
通过数据透视功能得到:
In [29]:
1 | df3 = df1.pivot_table(values=["col1","col2"],index=["col1","col2"]) |
In [30]:
1 | df3.index |
Out[30]: