6 ways to create a multi-level index MultiIndex

6 ways to create a multi-level index MultiIndex

Public number: You Er Hut
Author: Peter
Editor: Peter

Hello everyone, my name is Peter~

In the previous article, I introduced how to create a single-level index in Pandas. Today, I bring you how to create a multi-level index in Pandas .

pd.MultiIndex, an index with multiple levels. Through multi-level indexing, we can manipulate the data of the entire index group. This article mainly introduces 6 ways to create multi-level indexes in Pandas:

  • pd.MultiIndex.from_arrays(): Multidimensional arrays are used as parameters, high-dimensional specify high-level index, low-dimensional specify low-level index.
  • pd.MultiIndex.from_tuples(): List of tuples as argument, each tuple specifying each index (high- and low-dimensional index).
  • pd.MultiIndex.from_product(): A list of iterable objects is used as a parameter, and an index is created based on the Cartesian product of the elements of multiple iterable objects (a pairwise combination of elements).
  • pd.MultiIndex.from_frame: Generate directly from an existing data frame
  • groupby(): Obtained by data grouping statistics
  • pivot_table(): The way to generate a pivot table to get

pd.MultiIndex.from_arrays()

In [1]:

import pandas as pd
import numpy as np
复制代码

Generated by means of an array, usually specifying the elements in the list:

In [2]:

# 列表元素是字符串和数字
array1 = [["xiaoming","guanyu","zhangfei"], 
          [22,25,27]
         ]

m1 = pd.MultiIndex.from_arrays(array1)
m1
复制代码

Out[2]:

MultiIndex([('xiaoming', 22),
            (  'guanyu', 25),
            ('zhangfei', 27)],
           )
复制代码

In [3]:

type(m1)  # 查看数据类型
复制代码

To view the data type through the type function, it is found that it is indeed: MultiIndex

Out[3]:

pandas.core.indexes.multi.MultiIndex
复制代码

The name of each level can be specified at the time of creation:

In [4]:

# 列表元素全是字符串
array2 = [["xiaoming","guanyu","zhangfei"],
          ["male","male","female"]
         ]

m2 = pd.MultiIndex.from_arrays(
	array2, 
  # 指定姓名和性别
  names=["name","sex"])
m2
复制代码

Out[4]:

MultiIndex([('xiaoming',   'male'),
            (  'guanyu',   'male'),
            ('zhangfei', 'female')],
           names=['name', 'sex'])
复制代码

The following example generates 3-level indexes and specifies names:

In [5]:

array3 = [["xiaoming","guanyu","zhangfei"],
          ["male","male","female"],
          [22,25,27]
         ]

m3 = pd.MultiIndex.from_arrays(
	array3, 
	names=["姓名","性别","年龄"])
	
m3
复制代码

Out[5]:

MultiIndex([('xiaoming',   'male', 22),
            (  'guanyu',   'male', 25),
            ('zhangfei', 'female', 27)],
           names=['姓名', '性别', '年龄'])
复制代码

pd.MultiIndex.from_tuples()

Generate multi-level indexes in the form of tuples:

In [6]:

# 元组的形式
array4 = (("xiaoming","guanyu","zhangfei"), 
          (22,25,27)
         )

m4 = pd.MultiIndex.from_arrays(array4)
m4
复制代码

Out[6]:

MultiIndex([('xiaoming', 22),
            (  'guanyu', 25),
            ('zhangfei', 27)],
           )
复制代码

In [7]:

# 元组构成的3层索引
array5 = (("xiaoming","guanyu","zhangfei"),
          ("male","male","female"),
          (22,25,27))
         
m5 = pd.MultiIndex.from_arrays(array5)
m5
复制代码

Out[7]:

MultiIndex([('xiaoming',   'male', 22),
            (  'guanyu',   'male', 25),
            ('zhangfei', 'female', 27)],
           )
复制代码

Lists and tuples can be mixed :

  • The outermost layer is the list
  • All are tuples

In [8]:

array6 = [("xiaoming","guanyu","zhangfei"),
          ("male","male","female"),
          (18,35,27)
         ]
# 指定名字
m6 = pd.MultiIndex.from_arrays(array6,names=["姓名","性别","年龄"])
m6
复制代码

Out[8]:

MultiIndex([('xiaoming',   'male', 18),
            (  'guanyu',   'male', 35),
            ('zhangfei', 'female', 27)],
           names=['姓名', '性别', '年龄'] # 指定名字
           )
复制代码

pd.MultiIndex.from_product()

使用可迭代对象的列表作为参数,根据多个可迭代对象元素的笛卡尔积(元素间的两两组合)进行创建索引。

在Python中,我们使用 isinstance()函数 判断python对象是否可迭代:

# 导入 collections 模块的 Iterable 对比对象
from collections import Iterable
复制代码

通过上面的例子我们总结:常见的字符串、列表、集合、元组、字典都是可迭代对象

下面举例子来说明:

In [18]:

names = ["xiaoming","guanyu","zhangfei"]
numbers = [22,25]

m7 = pd.MultiIndex.from_product(
    [names, numbers], 
    names=["name","number"]) # 指定名字
m7
复制代码

Out[18]:

MultiIndex([('xiaoming', 22),
            ('xiaoming', 25),
            (  'guanyu', 22),
            (  'guanyu', 25),
            ('zhangfei', 22),
            ('zhangfei', 25)],
           names=['name', 'number'])
复制代码

In [19]:

# 需要展开成列表形式
strings = list("abc") 
lists = [1,2]

m8 = pd.MultiIndex.from_product(
	[strings, lists],
	names=["alpha","number"])
m8
复制代码

Out[19]:

MultiIndex([('a', 1),
            ('a', 2),
            ('b', 1),
            ('b', 2),
            ('c', 1),
            ('c', 2)],
           names=['alpha', 'number'])
复制代码

In [20]:

# 使用元组形式
strings = ("a","b","c") 
lists = [1,2]

m9 = pd.MultiIndex.from_product(
	[strings, lists],
	names=["alpha","number"])
	
m9
复制代码

Out[20]:

MultiIndex([('a', 1),
            ('a', 2),
            ('b', 1),
            ('b', 2),
            ('c', 1),
            ('c', 2)],
           names=['alpha', 'number'])
复制代码

In [21]:

# 使用range函数
strings = ("a","b","c")  # 3个元素
lists = range(3)  # 0,1,2  3个元素

m10 = pd.MultiIndex.from_product(
	[strings, lists],
	names=["alpha","number"])
	
m10
复制代码

Out[21]:

MultiIndex([('a', 0),
            ('a', 1),
            ('a', 2),
            ('b', 0),
            ('b', 1),
            ('b', 2),
            ('c', 0),
            ('c', 1),
            ('c', 2)],
           names=['alpha', 'number'])
复制代码

In [22]:

# 使用range函数
strings = ("a","b","c") 
list1 = range(3)  # 0,1,2
list2 = ["x","y"]

m11 = pd.MultiIndex.from_product(
	[strings, list1, list2],
  names=["name","l1","l2"]
  )
m11  # 总个数 3*3*2=18
复制代码

总个数是``332=18`个:

Out[22]:

MultiIndex([('a', 0, 'x'),
            ('a', 0, 'y'),
            ('a', 1, 'x'),
            ('a', 1, 'y'),
            ('a', 2, 'x'),
            ('a', 2, 'y'),
            ('b', 0, 'x'),
            ('b', 0, 'y'),
            ('b', 1, 'x'),
            ('b', 1, 'y'),
            ('b', 2, 'x'),
            ('b', 2, 'y'),
            ('c', 0, 'x'),
            ('c', 0, 'y'),
            ('c', 1, 'x'),
            ('c', 1, 'y'),
            ('c', 2, 'x'),
            ('c', 2, 'y')],
           names=['name', 'l1', 'l2'])
复制代码

pd.MultiIndex.from_frame()

通过现有的DataFrame直接来生成多层索引:

df = pd.DataFrame({"name":["xiaoming","guanyu","zhaoyun"],
                  "age":[23,39,34],
                  "sex":["male","male","female"]})
df
复制代码

直接生成了多层索引,名字就是现有数据框的列字段:

In [24]:

pd.MultiIndex.from_frame(df)
复制代码

Out[24]:

MultiIndex([('xiaoming', 23,   'male'),
            (  'guanyu', 39,   'male'),
            ( 'zhaoyun', 34, 'female')],
           names=['name', 'age', 'sex'])
复制代码

通过names参数来指定名字:

In [25]:

# 可以自定义名字

pd.MultiIndex.from_frame(df,names=["col1","col2","col3"])
复制代码

Out[25]:

MultiIndex([('xiaoming', 23,   'male'),
            (  'guanyu', 39,   'male'),
            ( 'zhaoyun', 34, 'female')],
           names=['col1', 'col2', 'col3'])
复制代码

groupby()

通过groupby函数的分组功能计算得到:

In [26]:

df1 = pd.DataFrame({"col1":list("ababbc"),
                   "col2":list("xxyyzz"),
                   "number1":range(90,96),
                   "number2":range(100,106)})
df1
复制代码

Out[26]:

df2 = df1.groupby(["col1","col2"]).agg({"number1":sum,
                                        "number2":np.mean})
df2
复制代码

查看数据的索引:

In [28]:

df2.index
复制代码

Out[28]:

MultiIndex([('a', 'x'),
            ('a', 'y'),
            ('b', 'x'),
            ('b', 'y'),
            ('b', 'z'),
            ('c', 'z')],
           names=['col1', 'col2'])
复制代码

pivot_table()

通过数据透视功能得到:

In [29]:

df3 = df1.pivot_table(values=["col1","col2"],index=["col1","col2"])
df3
复制代码

In [30]:

df3.index
复制代码

Out[30]:

MultiIndex([('a', 'x'),
            ('a', 'y'),
            ('b', 'x'),
            ('b', 'y'),
            ('b', 'z'),
            ('c', 'z')],
           names=['col1', 'col2'])
复制代码

Guess you like

Origin juejin.im/post/7078198153148661790