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 。