python中iloc和loc函数区别_iloc与loc区别

iloc PK loc

导入numpy,pandas

import numpy as np

import pandas as pd1

2

构建一个0,30左闭右开的偶数数组

data=np.arange(0,30,2) #arange(起始,结束,相差)

data

array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28])1

2

3

类型ndarray

print(type(data))

1

2

reshape变换形状

data1=data.reshape(5,3) #reshape转换形状

print(data1)

[[ 0 2 4]

[ 6 8 10]

[12 14 16]

[18 20 22]

[24 26 28]]1

2

3

4

5

6

7

类型还是ndarray

print(type(data1))

1

2

由ndarray类型转成DaTaframe类型

data2=pd.DataFrame(data1,columns=('a','b','c')) #columns定义字段

data2

abc

0024

16810

2121416

3182022

42426281

2

3

4

5

6

7

8

9

iloc

取指定单行多列

data2.iloc[2]

a 12

b 14

c 16

Name: 2, dtype: int321

2

3

4

5

iloc[start:end],索引[开始:结束],左闭右开

data2.iloc[1:4]

abc

16810

2121416

31820221

2

3

4

5

指定行,列取到一个数字

data2.iloc[2,2] #[行,列]

161

2

不能直接取字段,报取值错误

data2.iloc[2,'c'] #[行,列]

#ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types1

2

可以用切片来取指定行列

data2.iloc[2:3,0:]

abc

21214161

2

3

取出DataFrame里面的值为ndarray

data2.iloc[2:3,0:].values

array([[12, 14, 16]])1

2

loc

取第指定单行行,多列,与iloc一样

data2.loc[2]

a 12

b 14

c 16

Name: 2, dtype: int321

2

3

4

5

loc[start:end],索引[开始:结束],左闭右闭–>与iloc不同

data2.loc[1:4]

abc

16810

2121416

3182022

42426281

2

3

4

5

6

不能像iloc一样直接取指定行,报类型错误

data2.loc[2,3] ##[行,列] 报错

#TypeError: cannot do label indexing on with these indexers [2] of 1

2

可以去特定行和列,得到指定得一个数字

data2.loc[2,'c']

161

2

取指定data3指定行,指定列,有字段

data3=data2.loc[1:4]

data4=data3[['a','b']]

print(data4)

print(type(data4)) #类型DataFrame

a b

1 6 8

2 12 14

3 18 20

4 24 26

1

2

3

4

5

6

7

8

9

10

不能按着iloc的模样取字段下的值

data2.loc[[1:4],['a','b']]

SyntaxError: invalid syntax1

2

取data3指定行单列,有字段,类型DataFrame

data5=data3[['a']]

print(data5)

print(type(data5))

a

1 6

2 12

3 18

4 24

1

2

3

4

5

6

7

8

9

10

取data3指定行单列,没有字段,类型Series

data6=data3['a']

print(data6)

print(type(data6))

1 6

2 12

3 18

4 24

Name: a, dtype: int32

1

2

3

4

5

6

7

8

9

它是datframe类型,取多列要行列并行都存在于一个列表里。

data5可以取是因为它取单列,

data6可以取是因为它取单列,并且是按series类型取的,多列不行。

data7=data3['a','b']

print(data7)

print(type(data7))

#KeyError: ('a', 'b')1

2

3

4

上面我们证实data2.loc[2,3]会报类型错误

但是我们让它有用武之地

取出特定行与列的内容

类型DataFrame

data8=data2.loc[[2,3],['b','c']]

data8

bc

21416

320221

2

3

4

5

还可以这样重复取

data9=data2.loc[[2,2,2,3],['b','c']]

data9

bc

21416

21416

21416

320221

2

3

4

5

6

7

总结:

1.loc:

通过行标签索引行数据

例:loc[n]表示索引的是第n行(index 是整数)

loc[‘d’]表示索引的是第’d’行(index 是字符)

有行索引可以没有字段取值,但有字段取值前必须得有行索引,

而且行索引只能为标签索引形式来取,不能按切片形式来取。

单取切片形式可以,只是索引为左闭右闭。

2. .iloc:

通过行索引获取行数据,不能是字符,取索引必须按切片形式来取,不能按标签,这是与loc的不同。索引为左闭右开。iloc也可以取指定行列,只不过得按切片形式索引,不能直接拿标签索引来做。

建议:

当用行索引的时候, 尽量用 iloc 来进行索引; 而用标签索引的时候用 loc 。

你可能感兴趣的:(python中iloc和loc函数区别_iloc与loc区别)