pandas学习(创建多层索引、数据重塑与轴向旋转)

pandas学习(创建多层索引、数据重塑与轴向旋转)

目录

创建多层索引

数据重塑与轴向旋转

创建多层索引

隐式构造

Series

最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组,Series也可以创建多层索引。

s = Series(np.random.randint(0,150,size=6),index=[[‘a‘,‘a‘,‘b‘,‘b‘,‘c‘,‘c‘],[‘期中‘,‘期末‘,‘期中‘,‘期末‘,‘期中‘,‘期末‘]])
# 输出
a  期中    59
   期末    43
b  期中    28
   期末    99
c  期中    92
   期末    58
dtype: int32

  

DataFrame

df1 = DataFrame(np.random.randint(0,150,size=(4,6)),
               index = list(‘东南西北‘),
               columns=[[‘python‘,‘python‘,‘math‘,‘math‘,‘En‘,‘En‘],[‘期中‘,‘期末‘,‘期中‘,‘期末‘,‘期中‘,‘期末‘]])
      python      math       En
      期中   期末   期中  期末   期中  期末
东    137  119   22   3  130  79
南     90  146   60  80  143  23
西    105   31  125  87    7  66
北    131   62   13  67   81   3

  

显示构造pd.MultiIndex

使用数组构造

df2 = DataFrame(np.random.randint(0,150,size=(4,6)),
index = list(‘东南西北‘),
columns=[[‘python‘,‘python‘,‘math‘,‘math‘,‘En‘,‘En‘],[‘期中‘,‘期末‘,‘期中‘,‘期末‘,‘期中‘,‘期末‘]])
      python      math        En
      期中   期末   期中   期末   期中   期末
东     99   10  148    9  146  104
南     65   75    7    1   74  107
西    136   45   83  121   61   12
北    143  131   85   27   55   47

  

使用tuple构造

df3 = DataFrame(np.random.randint(0,150,size=(4,6)),
               index = list(‘东南西北‘),
               columns =pd.MultiIndex.from_tuples([(‘python‘,‘期中‘),(‘python‘,‘期末‘),
                                                  (‘math‘,‘期中‘),(‘math‘,‘期末‘),
                                                  (‘En‘,‘期中‘),(‘En‘,‘期末‘)]))

  

      python      math       En
      期中   期末   期中   期末  期中   期末
东      4   76   53  117  62   29
南    124   28   61   13  62  117
西     87  137   64  125  44   76
北     82  120   75  126  78  101

  

使用product构造(推荐)

df4 = DataFrame(np.random.randint(0,150,size=(8,12)),
               columns = pd.MultiIndex.from_product([[‘模拟考‘,‘正式考‘],
                                                   [‘数学‘,‘语文‘,‘英语‘,‘物理‘,‘化学‘,‘生物‘]]),
               index = pd.MultiIndex.from_product([[‘期中‘,‘期末‘],
                                                   [‘雷军‘,‘李斌‘],
                                                  [‘测试一‘,‘测试二‘]]))

  

           模拟考                           正式考
            数学   语文   英语   物理   化学   生物   数学   语文   英语   物理   化学   生物
期中 雷军 测试一   18   74  113   13   15   73   80  122   80   45   38  103
      测试二  107   21    7  110   50   32   94   61   78  107   29   17
   李斌 测试一   62   73   41    8  111   89  100   27   70   58   78    9
      测试二  142   57   22  103  121  117  134   76  122  112  147  129
期末 雷军 测试一  129   26  144  106   63  130   23   68   64   92  126   86
      测试二  135   84  137   44  121   64  133   56   70  116  147   96
   李斌 测试一   56  141   40   20   83   84  133  144  105  100  129   52
      测试二   73    3  114  103  105   41   85   39   30  112   94   64

  

数据重塑与轴向旋转

数据重塑

层次化索引:层次化索引pandas的一项重要功能,它能使我们在一个轴上拥有多个索引

Series的层次化索引

import numpy as npimport pandas as pd

s=pd.Series(np.arange(1,10),index=[[‘a‘,‘a‘,‘a‘,‘b‘,‘b‘,‘b‘,‘c‘,‘c‘,‘c‘],[‘1‘,‘2‘,‘3‘,‘1‘,‘2‘,‘3‘,‘1‘,‘2‘,‘3‘]])
print(s)
print(s.index)

#取值(外层索引)
print(s[‘a‘])
print(s[‘a‘:‘c‘])

#取值(内层索引 )
print(s[:,‘1‘])

#取值(具体值)
print(s[‘a‘,‘1‘])

#通过unstack方法可以将Series变成一个DataFrame
s=s.unstack()
print(s)
#通过 stack方法可以将stack方法将DataFrame变成Series
s=s.stack()
print(s)

  

#原始数据a  1    1
   2    2
   3    3
b  1    4
   2    5
   3    6
c  1    7
   2    8
   3    9
dtype: int32

#索引
MultiIndex(levels=[[‘a‘, ‘b‘, ‘c‘], [‘1‘, ‘2‘, ‘3‘]],
           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])

#s[‘a‘],通过外层索引取值
1    1
2    2
3    3
dtype: int32

#s[‘a‘:‘c‘],切片
a  1    1
   2    2
   3    3
b  1    4
   2    5
   3    6
c  1    7
   2    8
   3    9
dtype: int32

#s[:,‘1‘],内层索引取值
a    1
b    4
c    7
dtype: int32

#s[‘a‘,‘1‘],取具体值
1

#通过unstack方法将Series转为DataFrame
   1  2  3
a  1  2  3
b  4  5  6
c  7  8  9

#通过stack方法将DataFrame转为Series
a  1    1
   2    2
   3    3
b  1    4
   2    5
   3    6
c  1    7
   2    8
   3    9
dtype: int32

DataFrame的层次化索引

#对于 DataFrame来说,行和列都能进行层次化索引,这就是说,可以有四个索引
#set_index可以把列变成索引
#reset_index是把索引变成列
#每一个索引都是一个元组

  

import numpy as npimport pandas as pddata=pd.DataFrame(np.arange(12).reshape(4,3),index=[[‘a‘,‘a‘,‘b‘,‘b‘],[1,2,1,2]],columns=[[‘A‘,‘A‘,‘B‘],[‘Z‘,‘X‘,‘C‘]])print(‘原始数据:‘)print(data)

#取值# (1) 可以直接使用列名称来进行列索引# (2) 使用行索引需要用ix(),loc()等函数# 推荐使用loc()函数#确定一个值需要四个索引

#取列print(‘取列‘)print(data[‘A‘,‘Z‘])

#取行print(‘取行‘)print(data.loc[‘a‘,1])

#取某个值print(‘取值‘)print(data.loc[‘a‘,1][‘A‘,‘Z‘])

  

原始数据:
     A       B
     Z   X   C
a 1  0   1   2
  2  3   4   5
b 1  6   7   8
  2  9  10  11
取列
a  1    0
   2    3
b  1    6
   2    9
Name: (A, Z), dtype: int32
取行
A  Z    0
   X    1
B  C    2
Name: (a, 1), dtype: int32
取值
0
# set_index是把列变成索引# reset_index是把索引变成列# 这样做会大大简化我们的筛选环节

import numpy as npimport pandas as pd#  读入数据df=pd.read_csv(‘data1.txt‘)print(‘原始数据‘)print(df)

print(‘设置列为索引‘)df=df.set_index([‘产地‘,‘名字‘])print(df)

#每一个索引都是一个元组print(‘返回索引的格式‘)print(df.index[0])

#获得某一行数据,数据以内层索引为序列print(‘获得某一行数据‘)print(df.loc[‘美国‘])

#对调内外层索引print(‘对调内外层索引‘)df=df.swaplevel(‘产地‘,‘名字‘)print(df)

#取消层次化索引print(‘取消层次化索引‘)df=df.reset_index()print(df)

  

原始数据
       名字    投票人数        类型    产地        上映时间   时长    年代   评分
0    美丽人生   42995  剧情/喜剧/爱情   意大利  1997-12-20  116  1997  9.5
1    阿甘正传  580897     剧情/爱情    美国  1994-06-23  142  1994  9.4
2  肖申克的救赎  692795     剧情/犯罪    美国  1994-09-10  142  1994  9.6
3    控方证人   42995  剧情/悬疑/犯罪    美国  1957-12-17  116  1957  9.5
4    霸王别姬  478523  剧情/爱情/同性  中国大陆  1993-01-01  171  1993  9.4
设置列为索引
               投票人数        类型        上映时间   时长    年代   评分
产地   名字
意大利  美丽人生     42995  剧情/喜剧/爱情  1997-12-20  116  1997  9.5
美国   阿甘正传    580897     剧情/爱情  1994-06-23  142  1994  9.4
     肖申克的救赎  692795     剧情/犯罪  1994-09-10  142  1994  9.6
     控方证人     42995  剧情/悬疑/犯罪  1957-12-17  116  1957  9.5
中国大陆 霸王别姬    478523  剧情/爱情/同性  1993-01-01  171  1993  9.4
返回索引的格式
(‘意大利‘, ‘美丽人生‘)
获得某一行数据
          投票人数        类型        上映时间   时长    年代   评分
名字
阿甘正传    580897     剧情/爱情  1994-06-23  142  1994  9.4
肖申克的救赎  692795     剧情/犯罪  1994-09-10  142  1994  9.6
控方证人     42995  剧情/悬疑/犯罪  1957-12-17  116  1957  9.5
对调内外层索引
               投票人数        类型        上映时间   时长    年代   评分
名字     产地
美丽人生   意大利    42995  剧情/喜剧/爱情  1997-12-20  116  1997  9.5
阿甘正传   美国    580897     剧情/爱情  1994-06-23  142  1994  9.4
肖申克的救赎 美国    692795     剧情/犯罪  1994-09-10  142  1994  9.6
控方证人   美国     42995  剧情/悬疑/犯罪  1957-12-17  116  1957  9.5
霸王别姬   中国大陆  478523  剧情/爱情/同性  1993-01-01  171  1993  9.4
取消层次化索引
       名字    产地    投票人数        类型        上映时间   时长    年代   评分
0    美丽人生   意大利   42995  剧情/喜剧/爱情  1997-12-20  116  1997  9.5
1    阿甘正传    美国  580897     剧情/爱情  1994-06-23  142  1994  9.4
2  肖申克的救赎    美国  692795     剧情/犯罪  1994-09-10  142  1994  9.6
3    控方证人    美国   42995  剧情/悬疑/犯罪  1957-12-17  116  1957  9.5
4    霸王别姬  中国大陆  478523  剧情/爱情/同性  1993-01-01  171  1993  9.4

  

轴向旋转

import numpy as npimport pandas as pd#  读入数据df=pd.read_csv(‘data1.txt‘)print(‘原始数据‘)print(df)
#数据旋转
#
# 行和列转化
# .T可以直接让数据的行和列进行交换
print(‘进行行和列的转换‘)print(df.T)

#DataFrame也可以使用stack和unstack,转化为层次化索引的Seriesprint(‘DataFrame---->Series‘)df=df.stack()print(df)

print(‘Series--->DataDrame‘)df=df.unstack()print(df)

  

原始数据
       名字    投票人数        类型    产地        上映时间   时长    年代   评分
0    美丽人生   42995  剧情/喜剧/爱情   意大利  1997-12-20  116  1997  9.5
1    阿甘正传  580897     剧情/爱情    美国  1994-06-23  142  1994  9.4
2  肖申克的救赎  692795     剧情/犯罪    美国  1994-09-10  142  1994  9.6
3    控方证人   42995  剧情/悬疑/犯罪    美国  1957-12-17  116  1957  9.5
4    霸王别姬  478523  剧情/爱情/同性  中国大陆  1993-01-01  171  1993  9.4
进行行和列的转换
               0           1           2           3           4
名字          美丽人生        阿甘正传      肖申克的救赎        控方证人        霸王别姬
投票人数       42995      580897      692795       42995      478523
类型      剧情/喜剧/爱情       剧情/爱情       剧情/犯罪    剧情/悬疑/犯罪    剧情/爱情/同性
产地           意大利          美国          美国          美国        中国大陆
上映时间  1997-12-20  1994-06-23  1994-09-10  1957-12-17  1993-01-01
时长           116         142         142         116         171
年代          1997        1994        1994        1957        1993
评分           9.5         9.4         9.6         9.5         9.4
DataFrame---->Series
0  名字            美丽人生
   投票人数         42995
   类型        剧情/喜剧/爱情
   产地             意大利
   上映时间    1997-12-20
   时长             116
   年代            1997
   评分             9.5
1  名字            阿甘正传
   投票人数        580897
   类型           剧情/爱情
   产地              美国
   上映时间    1994-06-23
   时长             142
   年代            1994
   评分             9.4
2  名字          肖申克的救赎
   投票人数        692795
   类型           剧情/犯罪
   产地              美国
   上映时间    1994-09-10
   时长             142
   年代            1994
   评分             9.6
3  名字            控方证人
   投票人数         42995
   类型        剧情/悬疑/犯罪
   产地              美国
   上映时间    1957-12-17
   时长             116
   年代            1957
   评分             9.5
4  名字            霸王别姬
   投票人数        478523
   类型        剧情/爱情/同性
   产地            中国大陆
   上映时间    1993-01-01
   时长             171
   年代            1993
   评分             9.4
dtype: object
Series--->DataDrame
       名字    投票人数        类型    产地        上映时间   时长    年代   评分
0    美丽人生   42995  剧情/喜剧/爱情   意大利  1997-12-20  116  1997  9.5
1    阿甘正传  580897     剧情/爱情    美国  1994-06-23  142  1994  9.4
2  肖申克的救赎  692795     剧情/犯罪    美国  1994-09-10  142  1994  9.6
3    控方证人   42995  剧情/悬疑/犯罪    美国  1957-12-17  116  1957  9.5
4    霸王别姬  478523  剧情/爱情/同性  中国大陆  1993-01-01  171  1993  9.4

  

原文地址:https://www.cnblogs.com/-wenli/p/10287202.html

时间: 2024-10-10 08:00:14

pandas学习(创建多层索引、数据重塑与轴向旋转)的相关文章

8 pandas模块,多层索引

1 创建多层索引 1)隐式构造 最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组 · Series也可以创建多层索引 一般情况下,两层索引就够用了 2)显式构造 pd.MultiIndex · 使用数组 · 使用tuple · 使用product     最简单,推荐使用 2 对DataFrame列同样可以设置多层索引 ============================ 练习8: 1 创建一个DataFrame,表示张三.李四期中.期末各科成绩. ======

重塑和轴向旋转

有许多用于重新排列表格型数据的基础运算.这些函数也称作重塑(reshape)或轴向旋转(pivot)运算 重塑层次化索引 层次化索引为DataFrame数据的重排任务提供了一致性方式. stack : 将数据的列旋转为行 unstack: 将数据的行旋转为列 看例子: data = DataFrame(np.arange(6).reshape((2, 3)), index=pd.Index(['Ohio', 'Colorado'], name='state'), columns=pd.Index

javascript学习-创建json对象数据,遍历

之前我已经有讲过后台返回json数据到前台,并在前台遍历json数据. 这里讲下直接在JS里创建JSON数据,然后遍历使用~ 创建代码例如以下:(创建的是JSON对象) var YearSelect = {}; var Year = 2014; var DateOption; for (var i = Year; i < Year + 12; i++) { DateOption = {'Year':i, 'Month':i-Year+1}; // alert(DateOption.Year) Y

pandas学习(常用数学统计方法总结、读取或保存数据、缺省值和异常值处理)

pandas学习(常用数学统计方法总结.读取或保存数据.缺省值和异常值处理) 目录 常用数学统计方法总结 读取或保存数据 缺省值和异常值处理 常用数学统计方法总结 count 计算非NA值的数量 describe 针对Series或DataFrame列计算统计 min/max/sum 计算最小值 最大值 总和 argmin argmax 计算能够获取到最小值和最大值的索引位置(整数) idxmin idxmax 计算能够获取到最小值和最大值的索引值 quantile 计算样本的分位数(0到1)

mssql2000数据库执行SQL语句来创建数据库以及数据表还有索引

创建数据库MSsql2000Create DATABASE databasename on primary (name='databasename_data',filename='C:\databasename_data.mdf',size=3mb,maxsize=UNLIMITED,filegrowth=10%)log on (name='databasename_log',filename='C:\databasename_log.ldf',size=3mb,filegrowth=10%)

MySQL忽略已重复数据强制创建唯一索引

常规方法: CREATE UNIQUE INDEX `idx_m2b_product_photo_pid_sort` ON `m2b`.`m2b_product_photo` (pid, sort) COMMENT '' ALGORITHM DEFAULT LOCK DEFAULT; 忽略已重复数据强制创建唯一索引的方法: ALTER IGNORE TABLE `m2b_product_photo` ADD UNIQUE `idx_m2b_product_photo_pid_sort` (`pi

lucene学习-创建索引

本文的lucene是基于lucene3.5版本. 使用lucene实现搜索引擎开发,核心的部分是建立索引和搜索.本节主要是记录创建索引部分的内容. 创建的索引结构如图所示. 创建索引的步骤分为以下几个步骤: 1.建立索引器IndexWriter 2.创建文档对象Document 3.建立信息对象字段Field 4.将Field对象添加到Document 5.将Document对象添加到IndexWriter对象中 下面简要介绍几个核心对象. (1).创建IndexWriter对象. IndexW

MySQL 创建唯一索引忽略对已经重复数据的检查

MySQL 创建唯一索引忽略对已经重复数据的检查 在创建唯一索引的基础上加上关键字"IGNORE "即可. # 重复数据 mysql> select aid,count(aid) as total ,email,tel_no,account_type,exten,passwd from fudao_admin group by user_name having total> 1; +-------+-------+--------------------------+---

Python数据分析之pandas学习

Python中的pandas模块进行数据分析. 接下来pandas介绍中将学习到如下8块内容:1.数据结构简介:DataFrame和Series2.数据索引index3.利用pandas查询数据4.利用pandas的DataFrames进行统计分析5.利用pandas实现SQL操作6.利用pandas进行缺失值的处理7.利用pandas实现Excel的数据透视表功能8.多层索引的使用 一.数据结构介绍 在pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame.Ser