写在前面
今天这部分我们要学习一下索引的操作。申明一下这个不是我自己编写的噢,是参加了Datawhale的组队学习,其中的成员GYH大神编写的joyful-pandas,可以取github上找到内容!(PS发现大神是同校的小学弟哈哈哈,真的很优秀,自己还要慢慢学习~)
如果有感兴趣的小伙伴可以github自取。
一、单级索引
1. loc方法、iloc方法、[]操作符
一般而言,最常用的索引方法就是这三类
- iloc表示位置索引(i表示index)
- loc表示标签索引
- []也具有很大的便利性
(a)loc方法
trick one: 所有在loc中使用的切片全部包含右端点的,这一点和我们之前的右边不到不一样
①单行索引
# 标签索引为 1103
# 也就是说如果行标签为字符型变量,那么df.loc['a']
df.loc[1103]
②多行索引
df.loc[[1102, 2304]]
df.loc[1304:]
df.loc[2402::-1] # 取从后向前的元素(从2402往前)
trick two: 类似小用法
import numpy as np
a=np.random.rand(5)
print(a)
[ 0.64061262 0.8451399 0.965673 0.89256687 0.48518743]
print(a[-1]) ## 取最后一个元素
[0.48518743]
print(a[:-1]) ## 除了最后一个取全部
[ 0.64061262 0.8451399 0.965673 0.89256687]
print(a[::-1]) ## 取从后向前(相反)的元素
[ 0.48518743 0.89256687 0.965673 0.8451399 0.64061262]
print(a[2::-1]) ## 取从下标为2的元素往前读取
[ 0.965673 0.8451399 0.64061262]
对于上面两种来说,默认是取出所有变量的数据的。
③单列索引
df.loc[:,'Height']
④多列索引
df.loc[:, ['Height','Math']] ## Height和Math两列
df.loc[:, 'Height':'Math'] ## Height到Math这三列
写出对应的变量名即可,记得要用[]括起来。
⑤联合索引
df.loc[1102:2401:3,'Height':'Math'].head()
这个索引的意思就是指首先按标签索引,1102到2401为区间,3为步长取数,其次取出Height到Math的这三列数据。
⑥函数式索引
# loc中使用的函数,传入参数就是前面的df
df.loc[lambda x:x['Gender']=='M'].head()
主要就是运用lambda函数对所有的记录进行遍历,找到符合条件的记录。
⑦布尔索引
# 语句一
df.loc[df['Address'].isin(['street_7','street_4'])].head()
# 语句二
## 这里是这样一个逻辑,首先遍历Address找到它的值,然后用i[-1]看是4还是7
df.loc[[True if i[-1]=='4' or i[-1]=='7' else False for i in df['Address'].values]].head()
(b)iloc方法
trick three: 注意与loc不同,切片右端点不包含
①单行索引
# 行位置为3的,也就是说从0开始,第四行
df.iloc[3]
②多行索引
# 第四行到第五行的记录
df.iloc[3:5]
③单列索引
df.iloc[:, 3].head()
这里我们看到都是按位置索引,位置为3,其实是第四列
④多列索引
# 这里的::-2是指所有列,然后步长为2,反向读取
df.iloc[:,7::-2].head()
df.iloc[:,7::-1].head()
⑤混合索引
df.iloc[3::4,7::-2]
⑥函数式索引
df.iloc[lambda x:[3]]
这个也是就是取位置为3的记录,即第四行
trick four: 由上所述,iloc中接收的参数只能为整数或整数列表,不能使用布尔索引
(c) []操作符
trick five: 如果不想陷入困境,请不要在行索引为浮点时使用[]操作符,因为在Series中的浮点[]并不是进行位置比较,而是值比较,非常特殊
(c.1)Series的[]操作
①单元素索引
# 使用索引标签
s = pd.Series(df['Math'], index=df.index)
# 找出索引标签为1101的Math值
s[1101]
索引标签的使用同前面
②多行索引
m = pd.Series(df['Height'], index=df.index)
m[2402::-1].head()
③函数式索引
s[lambda x: x.index[16::-6]]
# 注意使用lambda函数时,直接切片(如:s[lambda x: 16::-6])就报错,此时使用的不是绝对位置切片,而是元素切片,非常易错
# 注意是x.index
④布尔索引
s[s>80]
# 指值大于80的部分
(c.2)DataFrame的[]操作
①单行索引
df[1:2]
# 这里非常容易写成df['label'],会报错
# 用了标签位置的切片
# 如果想要获得某一个元素,可用如下get_loc方法:
row = df.index.get_loc(1102)
df[row:row+1]