Task03:索引

索引器

列索引(for表)

【df[‘col1’]】 == 【df.列名】#(列名中不包含空格):取相应列
【df[[‘col1’, ‘col2’]]】#:取多列组成DataFrame

行索引(for序列)

以字符串为索引的Series
以整数位索引的Series

补充说明:
如果不想陷入麻烦,请不要把纯浮点以及任何混合类型(字符串、整数、浮点类型等的混合) 作为索引,否则可能会在具体的操作时报错或者返回非预期的结果

loc 索引

基于元素的 loc 索引器,基于位置的 iloc 索引器

loc[‘行名’, ‘列名’]
loc[,]的位置:单个元素、元素列表、元素切片、布尔列表、函数

[[‘行名1’,‘行名2’],[‘列名1’,‘列名2’]]【返回2行属性2列属性】
[‘行名1’:‘行名2’,‘列名1’:‘列名2’]【返回行1到行2列1到列2矩阵】

Series 使用字符串索引提过
如果是唯一值的起点和终点字符,那么就可以使用切片,并且包含两个端点。
如果不唯一则报错。

DataFrame 使用整数索引
使用整数切片的时字符串索引的要求一致。
是元素切片,【包含端点】且起点、终点不允许有重复值。
传入 loc 的布尔列表与 DataFrame 长度相同
列表为 True 的位置所对应的行会被选中,False 则会被剔除

传入元素列表可通过 isin 方法返回的布尔列表等价写出.【isin()】接收一个列表,判断该列中元素是否在列表中,同时对多个列过滤
df[df[某列].isin(条件)&df[某列].isin(条件)]

eg

# 选出所有大一和大四的同学信息
df_demo.loc[df_demo.Grade.isin(['Freshman', 'Senior'])].head()
# 选出【Grade】列中'Freshman'和'Senior'的所有信息

用函数进行切片操作
由于函数无法返回如 start: end: step 的切片形式
故返回切片时要用 slice 对象进行包装

布尔筛选优先考虑 loc
在使用布尔列表的时
不能传入 Series 而必须传入序列的 values ,否则会报错。
因此,在使用布尔筛选的时候还是应当优先考虑 loc 的方式。

query 方法(query询问)
把字符串形式的查询表达式传入 query 方法来查询数据,其表达式的执行结果必须返回布尔列表,会使代码长度在不降低可读性的前提下有所减少

IndexSlice 对象(对索引切片)

前面方法只能对元组整体进行切片,不能对每层进行切片,也不能将切片和布尔列表混合使用。
引入 IndexSlice 对象就能解决这个问题
【Slice】 对象一共有两种形式,
第一种为 loc[idx[,]] 型,
第二种为 loc[idx[,],idx[,]] 型

练习题

df = pd.read_csv('data/company.csv')
req=['Dairy', 'Bakery']
df.query("(age <= 40)&(department == @req)&(gender=='M')").head(3)

df.loc[(df.age<=40)&df.department.isin(req)&(df.gender=='M')].head(3)

123
2.

df.iloc[(df.EmployeeID%2==1).values,[0,2,-2]].head()#loc索引位置

12
3.

df_op = df.copy()
# 后三列设为索引后交换内外两层
df_op = df_op.set_index(df_op.columns[-3:].tolist()).swaplevel(0,2,axis=0)
# 恢复中间一层
df_op = df_op.reset_index(level=1)
# 修改外层索引名为 Gender
df_op = df_op.rename_axis(index={'gender':'Gender'})
# 用下划线合并两层行索引
df_op.index = df_op.index.map(lambda x:'_'.join(x))
df_op.index = df_op.index.map(lambda x:tuple(x.split('_')))
# 修改索引名为原表名称
df_op = df_op.rename_axis(index=['gender', 'department'])
# 恢复默认索引并将列保持为原表的相对位置
df_op = df_op.reset_index().reindex(df.columns, axis=1)
print(df_op.equals(df))

T3

idx = pd.IndexSlice
exclude = ['France', 'Canada', 'Amsterdam', 'Belgium']
# 设置索引
res = df.set_index(['Review Date', 'Company Location']).sort_index(level=0)	 	
res.loc[idx[2012:,~res.index.get_level_values(1).isin(exclude)],:].head(3)


太忙了于是没怎么好好整理内容,但是大部分都能接受理解。作业题里面巧克力比较简单就没有写。下次再也不会报两个DataWhale一起肝了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值