1.问题描述

今天引用一篇17年的python代码时出现了一点警告提示,

是关于pandas中ix切片函数的

ix函数Python_ix函数Python


这里提示让我们尽量使用loc或者iloc函数,究竟是为什么呢,在我们先熟悉三个函数的用法之后我们或许就明白了

~~ ---------------------------------------------------------------------------------------------------------------- ~~

这里我们首先创建一个数组供我们举例用

>>>  pada = pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
>>>  pada

		A	B	C	D		#行索引index对应‘abcd’,列的索引columns对应‘ABCD’
	a	0	1	2	3
	b	4	5	6	7
	c	8	9	10	11
	d	12	13	14	15

2.loc函数的使用

使用loc函数进行切片操作时只能使用列名或者行名,也就是‘abcd’和‘ABCD’
例如

>>> pada.loc['a','A']
	0
>>> pada.loc['a':'c','A':'B']

		A	B
	a	0	1      
	b	4	5
	c	8	9

提示:loc的切片操作是会包含:后的那一行列的,这一点要注意

loc不可以使用默认的‘0123’索引来切片,会报错

>>> pada.loc[0,0]    #会报错
>>> pada.loc[1:2,2:3]    #会报错

3.iloc函数的使用

iloc函数则和loc函数相反,只能使用默认的数字索引,不能使用自定义的行列名字索引

>>> pada.iloc[0,0]
	0
	
>>> pada.iloc[1:3,2:4] 

		C	D
	b	6	7
	c	10	11
	
>>> pada.iloc['a','A']    # 会报错
>>> pada.iloc['a':'c','A':'B']		#会报错

提示:iloc的切片操作是不会包含:后的那一行列的,这一点要注意和loc函数的区别

4.ix函数的使用

ix函数是合loc函数功能和iloc函数为一身,既可以使用行列名‘abcd’,‘ABCD’,也可以使用默认行列索引‘0123’

>>> pada.ix['a':'c',2:4]

		C	D
	a	2	3
	b	6	7
	c	10	11

5.看起来ix函数功能更强大一些,但是官方为什么还是不建议使用呢

我们不难想到这里我们的行列名称都是用的字母,但是我们要是用了数字作为行列名呢,这样用ix函数的时候不就乱了套么,它怎么知道你用的是默认索引该是自定义的数字索引呢,我想这就是官方不推荐的原因了

6.那我就是掺杂得想用默认索引和自定义索引怎么办呢,办法当然是有滴

方法一
方法有点笨,就是分两步走嘛,先用iloc,再用iloc,或者先用iloc,再用loc

方法二

>>> pada.iloc[1:2,pada.columns.get_loc('A')]
	b    4

这里的pada.columns.get_loc(‘A’)会得到’A‘的默认索引,这里相当于间接的使用了混合索引,但是没有破坏正常的语法规则