Joyful pandas--Task02 索引

这章内容太多了(哭唧唧),先这样,往后来补充吧。。

理论部分

  • 熟练掌握多种单层索引方式及其异同
  • 掌握和理解多级索引操作
  • 熟悉常用索引设定方法及其区别
  • 掌握索引函数、去重函数和抽样函数
    练习部分
  • UFO数据集分析
  • 口袋妖怪数据集分析
    一、单级索引
  1. loc方法、iloc方法、[]操作符
    最常用的索引方法可能就是这三类,其中iloc表示位置索引,loc表示标签索引,[]也具有很大的便利性,各有特点
    (a)loc方法
#① 单行索引
 df.loc[1103]
 #② 多行索引
df.loc[[1102,2304]]
#(注意:所有在loc中使用的切片全部包含右端点!这是因为如果作为Pandas的使用者,那么肯定不太关心最后一个标签再往后一位是什么,但是如果是左闭右开,那么就很麻烦,先要知道再后面一列的名字是什么,非常不方便,因此Pandas中将loc设计为左右全闭)
df.loc[1304:2103].head()
df.loc[2402::-1].head()
#③ 单列索引:
df.loc[:,'Height'].head()
#④ 多列索引:
df.loc[:,['Height','Math']].head()
#注意与下区别
df.loc[:,'Height':'Math'].head()
#⑤ 联合索引:3代表间隔
df.loc[1102:2401:3,'Height':'Math'].head()
#⑥ 函数式索引:
df.loc[lambda x:x['Gender']=='M'].head()
#loc中使用的函数,传入参数就是前面的df
#这里的例子表示,loc中能够传入函数,并且函数的输入值是整张表,输出为标量、切片、合法列表(元素出现在索引中)、合法索引
def f(x):
    return [1101,1103]
df.loc[f]
#⑦ 布尔索引(将重点在第2节介绍)
df.loc[[True if i[-1]=='4' or i[-1]=='7' else False for i in df['Address'].values]].head()
df.loc[df['Address'].isin(['street_7','street_4'])].head()

**小节:**本质上说,loc中能传入的只有布尔列表和索引子集构成的列表,只要把握这个原则就很容易理解上面那些操作
(b)iloc方法(注意与loc不同,切片右端点不包含)

#① 单行索引:
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中接收的参数只能为整数或整数列表或布尔列表,不能使用布尔Series,如果要用就必须如下把values拿出来

(c) []操作符
(c.1)Series的[]操作

#① 单元素索引:
s = pd.Series(df['Math'],index=df.index)
s[1101]
#使用的是索引标签
#② 多行索引:
s[0:4]
#使用的是绝对位置的整数切片,与元素无关,这里容易混淆
#③ 函数式索引:
s[lambda x: x.index[16::-6]]
#注意使用lambda函数时,直接切片(如:s[lambda x: 16::-6])就报错,此时使用的不是绝对位置切片,而是元素切片,非常易错
#④ 布尔索引:
s[s>80]
#【注意】如果不想陷入困境,请不要在行索引为浮点时使用[]操作符,因为在Series中[]的浮点切片并不是进行位置比较,而是值比较,非常特殊
s_int = pd.Series([1,2,3,4],index=[1,3,5,6])
s_float = pd.Series([1,2,3,4],index=[1.,3.,5.,6.])
s_int
s_int[2:]
s_float
#注意和s_int[2:]结果不一样了,因为2这里是元素而不是位置
s_float[2:]

(c.2)DataFrame的[]操作

#① 单行索引:
df[1:2]
#这里非常容易写成df['label'],会报错
#同Series使用了绝对位置切片
#如果想要获得某一个元素,可用如下get_loc方法:
row = df.index.get_loc(1102)
df[row:row+1]
#② 多行索引:
#用切片,如果是选取指定的某几行,推荐使用loc,否则很可能报错
df[3:5]
#③ 单列索引:
df['School'].head()
#④ 多列索引:
df[['School','Math']].head()
#⑤函数式索引:
df[lambda x:['Math','Physics']].head()
#⑥ 布尔索引:
df[df['Gender']=='F'].head()

小节:一般来说,[]操作符常用于列选择或布尔选择,尽量避免行的选择

  1. 布尔索引
#(a)布尔符号:'&','|','~':分别代表和and,或or,取反not
df[(df['Gender']=='F')&(df['Address']=='street_2')].head()
df[(df['Math']>85)|(df['Address']=='street_7')].head()
df[~((df['Math']>75)|(df['Address']=='street_1'))].head()
#loc和[]中相应位置都能使用布尔列表选择:
df.loc[df['Math']>60,df.columns=='Physics'].head()
#思考:为什么df.loc[df['Math']>60,(df[:8]['Address']=='street_6').values].head()得到和上述结果一样?values能去掉吗?
#(b) isin方法
df[df['Address'].isin(['street_1','street_4'])&df['Physics'].isin(['A','A+'])]
#上面也可以用字典方式写:
df[df[['Address','Physics']].isin({'Address':['street_1','street_4'],'Physics':['A','A+']}).all(1)]
#all与&的思路是类似的,其中的1代表按照跨列方向判断是否全为True
  1. 快速标量索引
#当只需要取一个元素时,at和iat方法能够提供更快的实现:
display(df.at[1101,'School'])
display(df.loc[1101,'School'])
display(df.iat[0,0])
display(df.iloc[0,0])
#可尝试去掉注释对比时间
#%timeit df.at[1101,'School']
#%timeit df.loc[1101,'School']
#%timeit df.iat[0,0]
#%timeit df.iloc[0,0]
  1. 区间索引
#此处介绍并不是说只能在单级索引中使用区间索引,只是作为一种特殊类型的索引方式,在此处先行介绍
#(a)利用interval_range方法
pd.interval_range(start=0,end=5)
#closed参数可选'left''right''both''neither',默认左开右闭
pd.interval_range(start=0,periods=8,freq=5)
#periods参数控制区间个数,freq控制步长
#(b)利用cut将数值列转为区间为元素的分类变量,例如统计数学成绩的区间情况:
math_interval = pd.cut(df['Math'],bins=[0,40,60,80,100])
#注意,如果没有类型转换,此时并不是区间类型,而是category类型
math_interval.head()
#(c)区间索引的选取
df_i = df.join(math_interval,rsuffix='_interval')[['Math','Math_interval']]\
            .reset_index().set_index('Math_interval')
df_i.head()
df_i.loc[65].head()
#包含该值就会被选中
df_i.loc[[65,90]].head()
#如果想要选取某个区间,先要把分类变量转为区间变量,再使用overlap方法
#df_i.loc[pd.Interval(70,75)].head() 报错
df_i[df_i.index.astype('interval').overlaps(pd.Interval(70, 85))].head()
#只要索引与(70,85]这个区间有交集就会被选中,注意pd.Interval默认构造区间都是左开右闭,可选closed参数right,left,both,neither

二、多级索引
三、索引设定
四、常用索引型函数
五、重复元素处理
六、抽样函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值