热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python pandas创建多层索引MultiIndex的6种方式【mysql基础】

这篇文章主要为大家介绍了python pandas创建多层索引MultiIndex的6种方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多

引言

在上一篇文章中介绍了如何创建Pandas中的单层索引,今天给大家带来的是如何创建Pandas中的多层索引。

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]:

import pandas as pd
import numpy as np

通过数组的方式来生成,通常指定的是列表中的元素:

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)  # 查看数据类型

通过type函数来查看数据类型,发现的确是:MultiIndex

Out[3]:

pandas.core.indexes.multi.MultiIndex

在创建的同时可以指定每个层级的名字:

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"])

下面的例子是生成3个层次的索引且指定名字:

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()

通过元组的形式来生成多层索引:

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)],
           )

列表和元组是可以混合使用的

  • 最外层是列表
  • 里面全部是元组

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"])

以上就是python pandas创建多层索引MultiIndex的6种方式的详细内容,更多关于python pandas多层索引MultiIndex的资料请关注编程笔记其它相关文章!


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
小丫2502895573
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有