文末领取【Python基础知识思维导图】
前置知识补充:
布尔索引:指的是通过传入一个判断条件来选择数据的方式,称之为布尔索引
普通索引:通过选择行/列名来选择数据的方式,称为普通索引
位置索引:通过传入具体的位置来选择数据的方式称为位置索引
准备示例数据:
# 创建一个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[s['age']<=22] [['name','age']] -- 输出结果: name age A1 qinlu 18 A2 lulu 19 A3 qinqin 22 # 找到符合条件的行 —— 得到数据结构,其实本身也是个数据框 # 然后再在这个数据行下,选择我们需要的列即可,因此,就完成了,对指定行、列进行选择; # case2: # 在以上基础上,只选择某一列,数据结构就变成了Series; s[s['age']<=22].name -- 输出结果: A1 qinlu A2 lulu A3 qinqin Name: name, dtype: object # case3: # 行、列索引放在同一个[]中,对行列同时选择: s.loc[s['age']<= 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.
作者:爱数据小辉
本文为中国统计网原创,转载请联系后台