pandas多层索引的创建和取值以及排序的实现

作者:蓝小白1024 时间:2023-07-09 23:12:54 

多层索引的创建

普通-多个index创建

  • 在创建数据的时候加入一个index列表,这个index列表里面是多个索引列表

Series多层索引的创建方法


import pandas as pd
s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'],
                 ['期中','期末','期中','期末','期中','期末']])
# print(s)
s

张三  期中    1
    期末    2
李四  期中    3
    期末    4
王五  期中    5
    期末    6
dtype: int64

利用 numpy中的随机数


import numpy as np

data = np.random.randint(0,100,size=(6,3))
# np.random.randint(0,100,size=(6,3))是使用numpy中的随机模块random中,生成随机整数方法randint,
# 里面的参数size是指定生成6行3列的数据,并且每个数字的范围在0到100之间

data

array([[44, 66, 67],
   [82, 52, 0],
   [34, 78, 23],
   [38, 4, 43],
   [60, 62, 40],
   [57, 9, 11]])

Dataframe多层索引创建


import pandas as pd
import numpy as np

data = np.random.randint(0,100,size=(6,3))
df = pd.DataFrame(data,index=[['张三','张三','李四','李四','王五','王五'],
              ['期中','期末','期中','期末','期中','期末']],
          columns=['Java','Web','Python'])

df


JavaWebPython
张三期中68490
期末336373
李四期中301368
期末141848
王五期中346626
期末891035

简化创建-from_product()


import pandas as pd
import numpy as np

data = np.random.randint(0,100,size=(6,3))
names = ['张三','李四','王五']
exam = ['期中','期末']
index = pd.MultiIndex.from_product([names,exam])
df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])
# print(df)
df


JavaWebPython
张三期中517847
期末395336
李四期中336083
期末90553
王五期中374566
期末68271

from_product()在这个里面的列表中位置不同, 产生的索引页会不同


index = pd.MultiIndex.from_product([exam, names])
df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])
# print(df)
df


JavaWebPython
期中张三517847
李四395336
王五336083
期末张三90553
李四374566
王五68271

from_product([exam,names])会将列表中第一个元素作为最外层索引,依次类推

多层索引的取值

获取到我们想要的数据

获取多层索引Series中的数据

创建数据


import pandas as pd
s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'],
                 ['期中','期末','期中','期末','期中','期末']])
print(s)

张三  期中    1
    期末    2
李四  期中    3
    期末    4
王五  期中    5
    期末    6
dtype: int64

可以直接使用[]的方式取最外面的一个层级 s[‘张三']


s['李四']

# 注意:[]取值方式,不可直接使用最外层以外的其他层级,例如:s['期末']

期中    3
期末    4
dtype: int64

使用['外索引', '内索引'], 获取某个数据

注意:[‘张三',‘期末']他们的顺序不能变。剥洋葱原则,从外到内一层一层的剥。


s['李四', '期中'] # 李四期中分值

# 注意:['张三','期末']他们的顺序不能变。剥洋葱原则,从外到内一层一层的剥。

3

使用[]的切片,获取数据s[:,‘期中']


s[:,'期中'] # 第一个值为全部的外索引

张三    1
李四    3
王五    5
dtype: int64

使用 loc

  • loc 使用的是标签suoyin

  • iloc使用的是位置索引


# loc 使用方式与 [] 的方式基本一样

s.loc['张三']
s.loc['张三','期中']
s.loc[:,'期中']

# iloc 的取值并不会受多层索引影响,只会根据数据的位置索引进行取值, 不推荐

张三    1
李四    3
王五    5
dtype: int64

多层索引DataFrame的取值

在对多层索引DataFrame的取值是,推荐使用 loc() 函数


import pandas as pd
import numpy as np
#size参数是指定生成6行3列的数组
data = np.random.randint(0,100,size=(6,3))
names = ['张三','李四','王五']
exam = ['期中','期末']
index = pd.MultiIndex.from_product([names,exam])
df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])
df


JavaWebPython
张三期中34052
期末743885
李四期中72816
期末9250
王五期中13248
期末49461

三种方式都可以获取张三期中各科成绩


# df.loc['张三','期中']
# df.loc['张三'].loc['期中']
# df.loc[('张三','期中')]

注意:DataFrame中对行索引的时候和Series有一个同样的注意点,就是无法直接对二级索引直接进行索引,必须让二级索引变成一级索引后才能对其进行索引

多层索引的排序

  • 使用sort_index() 排序

  • level参数可以指定是否按照指定的层级进行排列

  • 第一层索引值为0, 第二层索引的值为1

创建数据


import pandas as pd
data = np.random.randint(0,100,size=(9,3))
key1 = ['b','c','a']
key2 = [2,1,3]
index = pd.MultiIndex.from_product([key1,key2])
df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])

df



JavaWebPython
b2568281
1841655
3352586
c276176
1362894
3797097
a2251730
1383878
3417590

排序

  • DataFrame按行索引排序的方法是sort_index()

  • 如果直接使用的话,不传参数, 会把每一层索引根据值进行升序排序


df.sort_index()


JavaWebPython
a1186074
2668727
3961864
b1725852
2223122
3311283
c165496
294718
331634


# 当level=0时,ascending=False, 会根据第一层索引值进行降序排序
df.sort_index(level=0,ascending=False)


JavaWebPython
c3797097
276176
1362894
b3352586
2568281
1841655
a3417590
2251730
1383878


# 当level=1时,会根据第二层索引值进行降序排序

df.sort_index(level=1,ascending=False)

# 数据会根据第二层索引值进行相应的降序排列,
# 如果索引值相同时会根据其他层索引值排列


JavaWebPython
c3797097
b3352586
a3417590
c276176
b2568281
a2251730
c1362894
b1841655
a1383878

通过level设置排序的索引层级,其他层索引也会根据其排序规则进行排序

来源:https://blog.csdn.net/lxb_wyf/article/details/114273989

标签:pandas,多层索引
0
投稿

猜你喜欢

  • taobao cdn的缓存?

    2009-09-19 17:21:00
  • Python通过format函数格式化显示值

    2021-11-06 06:13:01
  • python Selenium实现付费音乐批量下载的实现方法

    2023-02-28 17:26:58
  • python shutil操作文件实例讲解

    2022-05-20 06:42:08
  • Python flask框架实现浏览器点击自定义跳转页面

    2023-04-26 15:48:31
  • Python THREADING模块中的JOIN()方法深入理解

    2021-10-16 16:54:01
  • 跨平台、多浏览器页面测试

    2008-06-24 11:54:00
  • Python标准库06之子进程 (subprocess包) 详解

    2021-05-24 02:00:25
  • Python实现RSA加密解密

    2022-04-22 19:07:41
  • Python面向对象程序设计之类和对象、实例变量、类变量用法分析

    2021-05-08 01:34:56
  • 走中国特色的网站重构道路

    2010-04-08 16:10:00
  • 全面理解javascript的caller,callee,call,apply概念

    2007-12-02 17:44:00
  • python argparse命令行参数解析(推荐)

    2022-06-26 05:47:25
  • python 提取视频中的音频工具类详解

    2023-08-15 06:10:26
  • Scrapy框架使用的基本知识

    2022-02-23 22:27:27
  • 快速掌握JavaScript正则表达式

    2010-01-23 11:39:00
  • ASP.Net MVC 布局页、模板页使用方法详细介绍

    2023-06-28 19:24:31
  • python TF-IDF算法实现文本关键词提取

    2022-10-08 16:06:25
  • Python实现关键路径和七格图计算详解

    2022-04-25 12:17:46
  • pytorch Dataset,DataLoader产生自定义的训练数据案例

    2022-12-05 06:41:23
  • asp之家 网络编程 m.aspxhome.com