Python语言Pandas库的DataFrames数据类型的索引写法比较多,既提供了方便也容易出错。一般的Python书籍上对Pandas索引都有介绍,本文总结一些个人体会,大体分为用中括号索引和用loc/iloc[]索引。

先生成一个DataFrame对象为例:

df=pd.DataFrame(np.random.rand(4,4), index=list('abcd'), columns=list('ABCD'))

  A B C D
a 0.959245 0.552285 0.265993 0.249411
b 0.743880 0.582683 0.310940 0.675503
c 0.644287 0.796247 0.202314 0.232712
d 0.149495 0.570265 0.095389 0.029824
1. 用中括号的索引

在用中括号索引时最容易犯错的是混淆了行索引和列索引。基本原则如下:

(1)单值索引只能索引列
df['A']是正确的写法,等同于df.A。如果想索引某一行,不能写成df['a']或df['a',:]
,否则会报错。但可以改用df[df.index=='a']或者df.loc['a']的形式。

(2)列表索引也只能索引列

如果想同时索引多列,可以写成df[['A','B']],记住有两层中括号,不能少一层中括号。如果写成
df['A','B']会报错,因为逗号被解释成了维度之间的分隔符。这里行索引只有'a',而没有'A',而且要表示'a'行'B'列应该用df.loc['a','B'],不能少了loc。
列表索引可以改变索引列的顺序,例如写成df[['C','B','A']]将按C、B、
A的顺序显示,这叫花式索引。花式索引也可以写成对象属性的形式,[[df.C, df.B, df.A]]也是正确的。

(3)切片只能索引多行

切片索引写成df['a':'c']或df[:2]表示索引a到c三行,但不能写成df['A':'C']或df[:,'A':'C']来索引三列。这点跟numpy的array不同,如果df是ndarray类型的,可以用df[:,
1:3]来切片第1~2列。要想切片多列可以写成df.loc[:,'A':'C'],但这里不能少了loc和:,,否则也报错。另外,切片只能用中括号或loc索引,而不能写成对象属性的形式,df.loc[:,
df.A:df.C]也会报错。
 

2. 用loc/iloc[]的索引


上面说了中括号不能对单个行进行索引,而用loc/iloc就解决了这个问题,例如df.loc['B']或df.iloc[2],所以要想索引某一行只能用loc/iloc的形式。由于loc可以索引单个行,为了不引起混淆,索引单个列时必须在前面加上符号“:,”,例如df.loc[:,'A']表示索引A列,如果写成df.loc['A']就会报错,因为Notebook会将df.loc['A']解读为df的A行而实际上df并没有A行。另外,iloc[]不能用于索引单个列。

 

3. 关于布尔索引


(1)布尔条件索引既可以索引行又可以索引列,既可以用于中括号索引又可以用于loc/iloc索引。但我建议尽量用loc索引,尤其是对列索引操作时不容易出错,用iloc或直接用方括号索引有时会出现未知错误。如果逻辑表达式是关于变量(列)取值的,布尔索引返回的是行数据,例如写成df.loc[关于列的条件]返回的是行数据。如果逻辑表达式是关于行索引取值的,例如写成
df.loc[关于行的条件],则返回的是列数据,例如df.loc[:, df.loc['c']>0.1]。另外还需注意df.loc[df['A']>0.1]
中内层的df不能漏了,如写成df[['A']>0.1]或
df['A'>0.1]系统只会把'A'当成是一个字符而报错,系统不知道A是指df的一列。如果只需要显示A列数据,不能写成df.A[df>0.1],而应该写成df.A[df.A>0.1]。

(2)当逻辑表达式是关于列名的,布尔索引可以用于对列索引,例如df.iloc[:, df.columns!='B']或df.loc[:,
df.columns!='B']都能执行,但此处不能少了loc和iloc,否则也报错。总之凡是把行索引写成“:,”再写列的选取条件的形式只能用在loc/iloc格式。

(3)如果要用布尔关系将多个条件组合起来,要给每个条件加小括号,例如df.loc[(df['A']>0.7) & (df['B']<0.5) &
(df['C']>0.6)],漏写小括号也会出错。
注意这里的运算符是位运算符&,而不是布尔运算符and,后者也会出错。如果需要返回整个矩阵,只能用中括号索引,而不能用loc/iloc[]。例如返回df中大于0.1的值应当写成df[df>0.1],而不能写成
df.loc[df>0.1]
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信