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 。