文章目录
内容介绍
这是第三篇打卡文章。
索引器
表的列索引
取单列数据
df['Name'].head()
取多列数据
df[['Gender', 'Name']].head()
loc索引器
loc的基本用法是df.loc[*]以及df.loc[*,*]
*可以替换为多种形式
df.loc[*]是选出部分行以及所有列
df.loc[*,*]是选出部分行和部分列
使用示例表格如上,名字作为行索引
类型 | 示例 | 备注 |
---|---|---|
单个元素 | df_demo.loc['Qiang Sun'] 以及df_demo.loc['Qiang Sun', 'School'] |
|
元素列表 | df_demo.loc[['Qiang Sun','Quan Zhao'] , ['School','Gender']] |
|
元素切片 | df_demo.loc['Gaojuan You':'Gaoqiang Qian', 'School':'Gender'] |
此时端点两侧需要是唯一的 |
布尔列表 | df_demo.loc[df_demo.Weight>70].head() |
|
函数 | df_demo.loc[lambda x:'Quan Zhao', lambda x:'Gender'] |
可以自定义函数,也可以是用匿名函数,但是返回值需要是前面四种形式 |
iloc索引器
iloc的使用与loc完全类似,只不过是针对位置进行筛选,在相应的*位置处一共也有五类合法对象,分别是:整数、整数列表、整数切片、布尔列表以及函数,函数的返回值必须是前面的四类合法对象中的一个,其输入同样也为DataFrame本身。
类型 | 示例 | 备注 |
---|---|---|
整数 | df_demo.iloc[1, 1] | 第二行第二列 |
整数列表 | df_demo.iloc[[0, 1], [0, 1]] | 前两行前两列 |
整数切片 | df_demo.iloc[1: 4, 2:4] | 切片不包含结束端点 |
布尔列表 | df_demo.iloc[(df_demo.Weight>80).values].head() | 不能传入Series而必须传入序列的values |
函数 | df_demo.iloc[lambda x: slice(1, 4)] | 传入切片为返回值的函数 |
query方法
query利用传入字符串的形式查询表中数据,可以直接使用列名。当列名带空格时,需要使用`列名`。条件的连接直接需要使用and,or,in,not in,同时条件要用括号括起来
# 筛选体重大于平均值的行
df.query('Weight > Weight.mean()').head()
out:
随机抽样
当我们处理大型数据,想要使用聚合函数得到数据的统计学特征时,如果直接计算,时间开销太大,于是我们需要去使用抽样方法来作为整个数据的统计特征的一个近似。
所以我们使用sample方法,它的重要参数有n, axis, frac, replace, weights
参数 | 作用 |
---|---|
n | 抽样数量 |
axis | 抽样的方向,0为行、1为列 |
frac | 抽样比例 |
replace | 是否是有放回抽样 |
weights | 每个样本的抽样概率 |
df_sample = pd.DataFrame({
'id': list('abcde'), 'value': [1, 2, 3, 4, 90]})
print(df_sample)
print('抽样结果')
# 利用value列做为抽样概率权重
df_sample.sample(3, replace = False, weights = df_sample.value)
out:
id value
0 a 1
1 b 2
2 c 3
3 d 4
4 e 90
抽样结果
id value
4 e 90
1 b 2
3 d 4
多级索引
多级索引以及表的结构
我们可以看到多级索引可以是行索引,也可以是列索引,在行索引是school,gender,列索引是Indicator,Grade,所以索引不再是一个单独的元素,而是由对应元素构成的元组
多级索引的相关属性
相关属性有names,values
如果想要获得某一层的索引,利用get_level_values()得到某一层的索引
多层索引中的loc
多层索引的loc方法与单层索引没有很大区别,只需要吧单独的元素换成一个元组。同时还需要注意的是筛选时要对索引进行排序,提高效率,避免警告。
# 利用set_index方法设置多重索引
df_multi = df.set_index(['School', 'Grade'])
# 先对数据进行排序,然后才能筛选
df_sorted = df_multi.sort_index()
df_sorted.loc[('Fudan University', 'Junior')].head()
同时还有一种特殊的用法,可以利用对各层的元素进行笛卡尔积的结果进行筛选
res = df_multi