导入库、读取文件
import numpy as np
import pandas as pd
df = pd.read_csv('data/table.csv',index_col='ID')#将索引为ID的列作为行索引
df.head()
一、单级索引
1.loc方法、iloc方法、[]操作符
最常用的索引方法可能就是这三类,其中iloc表示位置索引,loc表示标签索引,[]操作符有很大的便利性
(1)loc方法(所有在loc中使用的切片全部包含右端点)
本质上说,loc中能传入的只有布尔列表和索引子集构成的列表,只要把握这个原则就很容易理解下面的操作
单行索引
df.loc[1103]#获取指定行
多行索引
df.loc[[1102,2304]]#获取2个指明索引的行
df.loc[1304:].head()#获取从指定索引开始后的多行
df.loc[2402::-1].head()#获取从指定索引开始往上数的多行
单列索引
df.loc[:,'Height'].head()#获取指定列
多列索引
df.loc[:,['Height','Math']].head()#获取指定列索引的列
df.loc[:,['Height':'Math']].head()#获取指定列索引之间的列
联合索引
#在指定索引之间的行,每三行取一行;指定索引之间的列
df.loc[1102:2401:3,'Height':'Math'].head()
函数式索引
#loc中使用的函数,传入参数就是前面的df
df.loc[lambda x:x['Gender']=='M'].head()#先将Gender列中的内容替换为M
def f(x):
return [1101,1103]
df.loc[f]
布尔索引(重点在第2节介绍)
df.loc[df['Address'].isin(['street_7','street_4'])].head()
df.loc[[True if i[-1]=='4' or i[-1]=='7' else False for i in df['Address'].values]].head()
(2)iloc方法(注意与loc不同,切片右端点不包含)
iloc中接收的参数只能为整数或整数列表,不能使用布尔索引
单行索引
df.iloc[3] #索引从0开始,获取第4行
多行索引
df.iloc[3:5]#获取4-5行,切片右端点不包含,即没有第6行
单列索引
df.iloc[:,3].head()#索引从0开始,获取第4列
多列索引
df.iloc[:,7::-2].head()#从第8例开始,从右往左每2列
混合索引
df.iloc[3::4,7::-2].head()#从第4行开始,每隔4行;从第8例开始,从右往左每2列
函数式索引
df.iloc[lambda x:[3]].head()#获取第4行
(3)[]操作符
请不要在行索引为浮点时使用[]操作符,因为在Series中的浮点[]并不是进行位置比较,而是值比较,非常特殊
一般来说,[]操作符常用于列选择或布尔选择,尽量避免行的选择
(3.1)Series的[]操作
单元素索引
#使用的是索引标签
s = pd.Series(df['Math'],index=df.index)
s[1101]
多行索引
#使用的是绝对位置的整数切片,与元素无关,这里容易混淆
s[0:4]
函数式索引
#注意使用lambda函数时,直接切片(如:s[lambda x: 16::-6])就报错,此时使用的不是绝对位置切片,而是元素切片,非常易错
s[lambda x: x.index[16::-6]]
布尔索引
s[s>80]#大于80的为真
(3.2)DataFrame的[]操作
单行索引
df[1:2]#获取第2行
#这里非常容易写成df['label'],会报错
#同Series使用了绝对位置切片
#如果想要获得某一个元素,可用get_loc方法:
row = df.index.get_loc(1102)
df[row:row+1]
多行索引
#用切片,如果是选取指定的某几行,推荐使用loc,否则很可能报错
df[3:5]#获取4-5行
单列索引
df['School'].head()#一个Series
多列索引
df[['School','Math']].head()#获取指定索引的2列
函数式索引
df[lambda x:['Math','Physics']].head()#获取指定索引的2列
布尔索引
df