1.问题描述
今天引用一篇17年的python代码时出现了一点警告提示,
是关于pandas中ix切片函数的
这里提示让我们尽量使用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‘的默认索引,这里相当于间接的使用了混合索引,但是没有破坏正常的语法规则