Python拍了拍你,一份【同时选择行列方法】的盘点送给你

挖数网精选
挖数网精选
挖数网精选
446
文章
0
评论
2020-06-2413:06:00 评论 1,554 2998字
摘要

Python是一种跨平台的计算机程序设计语言,是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。

前置知识补充:

  • 布尔索引:指的是通过传入一个判断条件来选择数据的方式,称之为布尔索引
  • 普通索引:通过选择行/列名来选择数据的方式,称为普通索引
  • 位置索引:通过传入具体的位置来选择数据的方式称为位置索引
  • 切片索引:通过传入一个位置区间来获取数据的方式,称为切片索引

准备示例数据:

# 创建一个Serise —— 传入一个字典②

d= {

"name":["qinlu","lulu","qinqin","junjun"],

"sex":["male","male","female","male"],

"age":[18,19,22,25]

}

s= pd.DataFrame(d,index = ["A1","A2","A3","A4"])

s

-- 输出结果:

name sex age

A1 qinlu male 18

A2 lulu male 19

A3 qinqin female 22

A4 junjun male 25

方式一

布尔索引 + 普通索引选择指定的行和列

布尔索引 + 普通索引是先对表进行布尔索引选择行,然后通过普通索引选择列:

#case1:zjh-98

s展开<=22] [["name","age"]]

-- 输出结果:

name age

A1 qinlu 18

A2 lulu 19

A3 qinqin 22

# 找到符合条件的行 —— 得到数据结构,其实本身也是个数据框

# 然后再在这个数据行下,选择我们需要的列即可,因此,就完成了,对指定行、列进行选择;

# case2:

# 在以上基础上,只选择某一列,数据结构就变成了Series;

s展开<=22].name

-- 输出结果:

A1 qinlu

A2 lulu

A3 qinqin

Name: name, dtype: object

# case3:

# 行、列索引放在同一个[]中,对行列同时选择:

s.loc展开<= 22,["name","age"]]

-- 输出结果:

name age

A1 qinlu 18

A2 lulu 19

A3 qinqin 22

注意需要使用loc,不能使用iloc,否则会出现以下报错:

# 英:ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types汉:基于位置的索引只能具有[整数,整数切片(起始点为INCLUDED,结束点为EXCLUDED),类似整数的列表,布尔数组)类型

讲完普通索引,我们再来讲,使用"切片索引 + 切片索引"来选择指定行和列的方式。

方式二

切片索引 + 切片索引选择指定的行和列

切片索引 + 切片索引是同时传入行、列索引的位置区间进行数据选择。

# 选择第1行到第3行,第1列到第2列

s.iloc[0:3,0:3]

-- 输出:

name sex age

A1 qinlu male 18

A2 lulu male 19

A3 qinqin female 22

-- 常见错误1:

s.iloc[[0:3],[0:3]]

# 行列切片加上[]会出现报错, SyntaxError: invalid syntax/无效的语法

-- 常见错误2:

s.loc[0:3,0:3]]

# 位置索引注意需要使用iloc,不能使用loc,否则会出现以下报错:英:cannot do slice indexing on <class "pandas.core.indexes.base.Index"> with these indexers [0] of <class "int">; / 汉:无法使用<class"int">的这些索引器[0]在<class"pandas.core.indexes.base.Index">上进行切片索引

方式三

切片索引 + 普通索引选择指定的行和列

结论:新版本的Jupyter Notebook,目前已经不支持"ix"了!

如果是普通索引,就直接传入行或列名,用loc方法即可;如果是切片索引,也就是传入行或列名,用iloc方法即;如果是切片索引 + 普通索引,也就是行(列)用切片索引,列(行)用切片索引,列(行)用普通索引,看是否能够选择成功:

# case1:使用iloc发生报错

s.iloc[0:3,["name","age"]]

-- 输出报错:

# 报错:英:IndexError: .iloc requires numeric indexers, got ["name" "age"];汉:iloc需要数字索引器,得到["name""age"]

# 原因分析:当使用行(列)名称索引时,不能使用iloc方法;若使用iloc,必须要求行或列都严格使用数字或者切片进行索引;

# case2:使用loc出现报错

s.loc[0:3,["name","age"]]

-- 报错:

#报错:英:TypeError: cannot do slice indexing on <class "pandas.core.indexes.base.Index"> with these indexers [0] of <class "int"> / 中:TypeError:无法使用<class"int">的这些索引器[0]在<class"pandas.core.indexes.base.Index">上进行切片索引

# 原因分析:有数字/切片的索引不能使用loc

# case3:使用ix出现报错

s.ix[0:3,["name","age"]]

# 报错:英:AttributeError:" DataFrame"对象没有属性" ix";/汉:AttributeError:" DataFrame"对象没有属性" ix"

# 原因分析:新版本的anconda目前已经不支持"ix"了!

方式四

位置索引 + 位置索引选择指定行和列

# 位置索引:选择第1,4行,第1,3列

s.iloc[[0,3],[0,2]]

-- 输出结果:

name age

A1 qinlu 18

A4 junjun 25

# case1:索引超出

s.iloc[[1,2],[2,3]]

# 报错:IndexError: positional indexers are out-of-bounds/汉:IndexError:位置索引器超出范围;

# case2:s.loc[[0,3],[0,2]]

# 报错:KeyError: "None of [Int64Index([0, 3], dtype="int64")] are in the [index]"/ 中文:KeyError:" [Int64Index([0,3],dtype ="int64")]都不在[索引]中"

# 原因分析:当使用位置索引 + 位置索引选择指定行和列时,需要利用iloc方法传入行列位置

方式五

普通索引 + 普通索引选择指定行和列

# 普通索引 + 普通索引就是通过同时传入行和列的索引名称进行数据选择,需要用到loc方法;

s.loc[["A1","A2","A4"],["name","age"]]

-- 输出结果:

name age

A1 qinlu 18

A2 lulu 19

A4 junjun 25

# 报错:s.iloc[["A1","A2","A4"],["name","age"]];英文:IndexError: .iloc requires numeric indexers, got ["A1" "A2" "A4"]

原因分析:当使用普通索引 + 普通索引选择指定行和列时,不能使用iloc

End.

作者:爱数据小辉

本文为中国统计网原创,转载请联系后台

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: