一、索引
索引/选择的基本语法如下:
import numpy as np
import pandas as pd
df = pd.read_csv('pandas/joyful-pandas-master/data/table.csv',index_col='ID')
df.head()
一、单级索引
1. loc方法、iloc方法、[]操作符
最常用的索引方法可能就是这三类,其中iloc表示位置索引,loc表示标签索引,[]也具有很大的便利性,各有特点
基于标签的索引
- .loc 是基于标签的索引,必须使用数据的标签属性,否则会返回一个异常。
- 基于标签索引的基本语法 : df.loc[行索引,列索引]
- 逗号之前是切取的行信息,逗号之后是切取的列信息
- 只切取行信息返回所有列信息的时候,列索引和逗号可以省略
- 只切取列信息返回所有行信息的时候,行索引和冒号不能省略,用冒号表示切取所有行.
(a)loc方法(注意:所有在loc中使用的切片全部包含右端点!)
① 单行索引:
df.loc[1103]
② 多行索引:
df.loc[[1102,2304]]
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()
⑥ 函数式索引:
df.loc[lambda x:x['Gender']=='M'].head()
# loc中使用的函数,传入参数就是前面的df
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()
小节:本质上说,loc中能传入的只有布尔列表和索引子集构成的列表,只要把握这个原则就很容易理解上面那些操作.
(b)iloc方法(注意与loc不同,切片右端点不包含)
基于位置的索引
- .iloc 是基于位置的索引,传入的参数为目标区域的位置索引。
- 基于位置索引的基本语法 : df.iloc[行索引,列索引]
- 逗号之前是切取的行信息,逗号之后是切取的列信息
- 只切取行信息返回所有列信息的时候,列索引和逗号可以省略
- 只切取列信息返回所有行信息的时候,行索引和冒号不能省略,用冒号表示切取所有行.
直接切取一行信息的时候
- df["行信息":"行信息"] 返回是dataframe
- (基于标签的索引)df.loc["行信息"] 返回的是series
① 单行索引:
df.iloc[3]
② 多行索引:
df.iloc[3:5]
③ 单列索引:
df.iloc[:,3].head()
④ 多列索引:
df.iloc[:,7::-2].head()
⑤ 混合索引:
df.iloc[3::4,7::-2].head()
⑥ 函数式索引:
df.iloc[lambda x:[3]].head()
小节:由上所述,iloc中接收的参数只能为整数或整数列表,不能使用布尔索引
(c) []操作符
如果不想陷入困境,请不要在行索引为浮点时使用[]操作符,因为在Series中的浮点[]并不是进行位置比较,而是值比较,非常特殊
(c.1)Series的[]操作
① 单元素索引:
s = pd.Series(df['Math'],index=df.index)
s[1101]
#使用的是索引标签
34.0
② 多行索引:
s[0:4]
# 使用的是绝对位置的整数切片,与元素无关,这里容易混淆
③ 函数式索引:
s[lambda x: x.index[16::-6]]
#注意使用lambda函数时,直接切片(如:s[lambda x: 16::-6])就报错,此时使用的不是绝对位置切片,而是元素切片,非常易错
④ 布尔索引:
s[s>80]