各位同学好,今天我和大家分享一下Pandas库的索引操作中的修改值、查找值、高级索引。
首先,我们先定义两个变量ps1存放Series数据,pd1存放DataFrame数据,以便后续操作。
import pandas as pd
import numpy as np
ps1 = pd.Series(range(5),index=['a','b','c','d','e'])
pd1 = pd.DataFrame(np.arange(1,10).reshape(3,3),index=['a','b','c'],columns=['A','B','C'])
1. 索引操作 -- 改
1.1 对 Series 修改
利用标签索引修改: Series名[ 标签名 ] = 值
利用位置索引修改: Series名[ 位置数 ] = 值
# series修改
ps1['a'] = 999 #标签索引
ps1[1] = 888 #位置索引
将标签名'a'对应的值改成999,将位置索引1对应的值改为888。标签索引'a'对应的位置索引是0
1.2 对 DataFrame 修改
(1)利用标签索引修改一列数据: 变量名[ 列标签名 ] = 值/列表
#(1)利用索引修改一列的数据
pd1["A"] = 100
pd1["B"] = [9,99,999]
pd1["F"] = [8,8,8] #索引名不存在,增加一列
(2)利用对象修改一列数据: 变量名.列标签名 = 值/列表
#(2)利用对象修改一列的数据 变量名.索引 = [数据]
pd1.A = 0
pd1.C = [1,11,111]
(3)利用高级索引修改一行数据: 变量名.loc[ 行标签名 ] = 值/列表
(4)利用高级索引修改某一个数据:变量名.loc[ 行标签名, 列标签名 ] = 值
#(3)loc 标签索引
# 修改一行
pd1.loc['a'] = 777 # a索引对应的一行都变成777
#(4)修改单个数据 某行某列
pd1.loc['a','A'] = 1000
2. 索引操作 -- 查
2.1 对 Series 操作
(1)利用标签索引、位置索引查某个值: Series名[ 标签名 / 位置索引 ]
a1 = ps1['a'] #标签索引查值
a2 = ps1[0] #位置索引查值
(2)利用切片索引查一块值:
标签索引切片,顾头顾尾: Series名[ 标签名1 : 标签名2 ]
位置索引切片,顾头不顾尾: Series名[ 位置索引1 : 位置索引2 ]
# 切片索引
a3 = ps1['b':'d'] #标签切片,顾头顾尾
a4 = ps1[1:4] #位置切片,顾头不顾尾
(3)利用不连续索引查多个值:
使用标签索引: 变量名[[ 标签名1 , 标签名2 ]]
使用位置索引: 变量名[[ 位置索引1 , 位置索引2 ]]
# 不连续索引
a5 = ps1[['b','e']] #标签索引,两个中括号,代表取的是b这一行和e这一行,是不连续的
a6 = ps1[[0,2,3]] #位置索引
(4) 利用布尔索引取满足条件的值: 变量名[ 条件 ]
满足条件则为True,输出满足条件的值,如下式条件ps1>2。ps1中的值有0、1、2、3、4。其中对于ps>1这个条件。0,1,2都是False;3,4是True。因此输出的是3、4。
# 布尔索引
a7 = ps1[ps1>2] #取出ps1中所有大于2的值
2.2 对 DataFrame 操作
(1)利用标签索引查某一列: 变量名[ 标签名 ]
(2)利用标签索引查多列: 变量名[[ 标签名1 , 标签名2 ]]
# 只能用标签索引操作,不能用位置索引
a8 = pd1["A"] #标签索引,输出一列,返回series类型
a9 = pd1[["A","C"]] #不连续索引取多列
(3)利用标签索引取某一个值: 变量名[ 列索引名 ][ 行索引名 ]
# 选取一个值
a10 = pd1['A']['a']
(4)利用切片索引查连续几行数据:
位置索引切片,顾头不顾尾: 变量名[ 位置索引1 : 位置索引2 ]
标签索引切片,顾头顾尾: 变量名[ 标签名1 : 标签名2 ]
# 切片处理,获取的是行
a11 = pd1[:2] # 顾头不顾尾,获取前两行
a12 = pd1['a':'c'] # 顾头顾尾
3. 高级索引
3.1 loc 标签索引 --- 基于标签名的索引
(1)对 series 操作
利用标签索引切片: Series名[ 标签名1 : 标签名2 ]
利用高级索引切片: Series名.loc[ 标签名1 : 标签名2 ]
两种写法得到的结果相同
# 切片操作
a12 = ps1['a':'c']
a13 = ps1.loc['a':'c']
(2)对 DataFrame 操作
利用高级索引进行切片操作:
获取第几行第几列的某个值: 变量名.loc[ 行索引名 , 列索引名 ]
获取连续几行中某一列的数据: 变量名.loc[ 行索引名1 : 行索引名2 , 列索引名 ]
获取指定的某几行某几列的一块区域的数据:
变量名.loc[ 行索引名1 : 行索引名2 , 列索引名1 : 列索引名2 ]
# frame名.loc[行索引,列索引]
a14 = pd1.loc['a','A'] #取出第a行第A列的数
a15 = pd1.loc['a':'b','A'] #取出'a'到'b'行中第'A'列的数据
a16 = pd1.loc['a':'b','A':'C'] #取出'a'到'b'行中第'A'到'C'列的数据
3.2 iloc 位置索引
(1)对 Series 操作
利用位置索引切片: Series名[ 位置索引1 : 位置索引2 ]
利用高级索引切片: Series名.iloc[ 位置索引1 : 位置索引2 ]
位置索引切片顾头不顾尾,两种切片方法结果相同
# 对series操作
a17 = ps1[1:3] #位置切片,顾头不顾尾
a18 = ps1.iloc[1:3]
(2)对 DataFrame 操作
列用高级索引进行切片操作:
获取第几行第几列的某个值: 变量名.iloc[ 行位置索引 , 列位置索引 ]
获取连续几行中某一列的数据: 变量名.iloc[ 行位置1 : 行位置2 , 列位置 ]
获取指定的某几行某几列的一块区域的数据:
变量名.iloc[ 行位置1 : 行位置2 , 列位置1 : 列位置2 ]
位置索引顾头不顾尾
# frame名.iloc[行索引,列索引] 顾头不顾尾
a19 = pd1.iloc[0,2] # 获取第0行第2列的值
a20 = pd1.iloc[0:2,2] # 获取第0到1行中第2列的值
a21 = pd1.iloc[0:2,1:3] # 获取第0到1行中第1到2行的一块数据