iloc与loc区别

iloc PK loc

导入numpy,pandas

import numpy as np
import pandas as pd

构建一个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])

类型ndarray

print(type(data))
<class 'numpy.ndarray'>

reshape变换形状

data1=data.reshape(5,3) #reshape转换形状
print(data1)
[[ 0  2  4]
 [ 6  8 10]
 [12 14 16]
 [18 20 22]
 [24 26 28]]

类型还是ndarray

print(type(data1))   
<class 'numpy.ndarray'>

由ndarray类型转成DaTaframe类型

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

	a	b	c
0	0	2	4
1	6	8	10
2	12	14	16
3	18	20	22
4	24	26	28

iloc

取指定单行多列

data2.iloc[2] 
a    12
b    14
c    16
Name: 2, dtype: int32

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

data2.iloc[1:4] 
a	b	c
1	6	8	10
2	12	14	16
3	18	20	22

指定行,列取到一个数字

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

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

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] types

可以用切片来取指定行列

data2.iloc[2:3,0:]
a	b	c
2	12	14	16

取出DataFrame里面的值为ndarray

data2.iloc[2:3,0:].values
array([[12, 14, 16]])

loc

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

data2.loc[2]
a    12
b    14
c    16
Name: 2, dtype: int32

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

data2.loc[1:4]  
a	b	c
1	6	8	10
2	12	14	16
3	18	20	22
4	24	26	28

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

 data2.loc[2,3]  ##[行,列] 报错
#TypeError: cannot do label indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [2] of <class 'int'>

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

data2.loc[2,'c']
16

取指定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
<class 'pandas.core.frame.DataFrame'>

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

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

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

data5=data3[['a']]
print(data5)
print(type(data5))  
    a
1   6
2  12
3  18
4  24

<class 'pandas.core.frame.DataFrame'>

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

data6=data3['a']
print(data6)
print(type(data6)) 
1     6
2    12
3    18
4    24
Name: a, dtype: int32
<class 'pandas.core.series.Series'>

它是datframe类型,取多列要行列并行都存在于一个列表里。
data5可以取是因为它取单列,
data6可以取是因为它取单列,并且是按series类型取的,多列不行。

data7=data3['a','b']
print(data7)
print(type(data7)) 
#KeyError: ('a', 'b')

上面我们证实data2.loc[2,3]会报类型错误
但是我们让它有用武之地
取出特定行与列的内容
类型DataFrame

data8=data2.loc[[2,3],['b','c']]
data8
b	c
2	14	16
3	20	22

还可以这样重复取

data9=data2.loc[[2,2,2,3],['b','c']]
data9
b	c
2	14	16
2	14	16
2	14	16
3	20	22

总结:

1.loc:
通过行标签索引行数据
例:loc[n]表示索引的是第n行(index 是整数)
loc[‘d’]表示索引的是第’d’行(index 是字符)
有行索引可以没有字段取值,但有字段取值前必须得有行索引,
而且行索引只能为标签索引形式来取,不能按切片形式来取。
单取切片形式可以,只是索引为左闭右闭。

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

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

  • 41
    点赞
  • 156
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值