6 formas de crear un índice multinivel MultiIndex
Número público: You Er Hut
Autor: Peter
Editor: Peter
Hola a todos, mi nombre es Peter~
En el artículo anterior introduje cómo crear un índice de un solo nivel en Pandas, hoy les traigo cómo crear un índice de varios niveles en Pandas .
pd.MultiIndex, un índice con múltiples niveles. A través de la indexación multinivel, podemos manipular los datos de todo el grupo de índices. Este artículo presenta principalmente 6 formas de crear índices de varios niveles en Pandas:
- pd.MultiIndex.from_arrays(): Las matrices multidimensionales se utilizan como parámetros, las dimensiones altas especifican el índice de alto nivel, las dimensiones bajas especifican el índice de bajo nivel.
- pd.MultiIndex.from_tuples(): Lista de tuplas como argumento, cada tupla especificando cada índice (índice de alta y baja dimensión).
- pd.MultiIndex.from_product(): se utiliza una lista de objetos iterables como parámetro y se crea un índice basado en el producto cartesiano de los elementos de varios objetos iterables (una combinación de elementos por pares).
- pd.MultiIndex.from_frame: generar directamente desde un marco de datos existente
- groupby(): Obtenido por estadísticas de agrupación de datos
- pivot_table(): La forma de generar una tabla dinámica para obtener
pd.MultiIndex.from_arrays()
En 1]:
import pandas as pd
import numpy as np
复制代码
Generado por medio de un array, normalmente especificando los elementos de la lista:
En 2]:
# 列表元素是字符串和数字
array1 = [["xiaoming","guanyu","zhangfei"],
[22,25,27]
]
m1 = pd.MultiIndex.from_arrays(array1)
m1
复制代码
Salida[2]:
MultiIndex([('xiaoming', 22),
( 'guanyu', 25),
('zhangfei', 27)],
)
复制代码
En 3]:
type(m1) # 查看数据类型
复制代码
Para ver el tipo de datos a través de la función de tipo, se encuentra que efectivamente es: MultiIndex
Salida[3]:
pandas.core.indexes.multi.MultiIndex
复制代码
El nombre de cada nivel se puede especificar en el momento de la creación:
En [4]:
# 列表元素全是字符串
array2 = [["xiaoming","guanyu","zhangfei"],
["male","male","female"]
]
m2 = pd.MultiIndex.from_arrays(
array2,
# 指定姓名和性别
names=["name","sex"])
m2
复制代码
Fuera[4]:
MultiIndex([('xiaoming', 'male'),
( 'guanyu', 'male'),
('zhangfei', 'female')],
names=['name', 'sex'])
复制代码
El siguiente ejemplo genera índices de 3 niveles y especifica nombres:
En [5]:
array3 = [["xiaoming","guanyu","zhangfei"],
["male","male","female"],
[22,25,27]
]
m3 = pd.MultiIndex.from_arrays(
array3,
names=["姓名","性别","年龄"])
m3
复制代码
Fuera[5]:
MultiIndex([('xiaoming', 'male', 22),
( 'guanyu', 'male', 25),
('zhangfei', 'female', 27)],
names=['姓名', '性别', '年龄'])
复制代码
pd.MultiIndex.from_tuples()
Genere índices de varios niveles en forma de tuplas:
En [6]:
# 元组的形式
array4 = (("xiaoming","guanyu","zhangfei"),
(22,25,27)
)
m4 = pd.MultiIndex.from_arrays(array4)
m4
复制代码
Fuera[6]:
MultiIndex([('xiaoming', 22),
( 'guanyu', 25),
('zhangfei', 27)],
)
复制代码
En [7]:
# 元组构成的3层索引
array5 = (("xiaoming","guanyu","zhangfei"),
("male","male","female"),
(22,25,27))
m5 = pd.MultiIndex.from_arrays(array5)
m5
复制代码
Fuera[7]:
MultiIndex([('xiaoming', 'male', 22),
( 'guanyu', 'male', 25),
('zhangfei', 'female', 27)],
)
复制代码
Se pueden mezclar listas y tuplas :
- La capa más externa es la lista.
- todas son tuplas
En [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'])
复制代码