感谢datawhale,内容来自GYH joyful pandas
目录
索引器
索引
- 表的列索引
在取单独索引的时候df['Name']
等价于df.Name
- Series的行索引
- 以字符串作为索引值
# 如果想要取出某两个索引之间的元素,并且这两个索引是在整个索引中唯一出现,则可以使用切片,,同时需要注意这里的切片会包含两个端点:
s = pd.Series([1, 2, 3, 4, 5, 6], index=['a', 'b', 'a', 'a', 'a', 'c'])
s['c': 'b': -2]
#c 6
#a 4
#b 2
#dtype: int64
前面提到,当使用字符串作为索引时,进行切片两边都能取到,但是,在使用整数作为Series的所引时,不包含右端点。
loc的用法
对数据表的行进行选取,需要用到两个方法,loc或是iloc,其中loc
方法是基于元素的索引器,而iloc
则是基于位置的索引器
loc
索引器的一般形式是loc[*, *]
,其中第一个*
代表行的选择,第二个*
代表列的选择,如果省略第二个位置写作loc[*]
,这个*
是指行的筛选。其中,*
的位置一共有五类合法对象,分别是:单个元素、元素列表、元素切片、布尔列表以及函数,下面将依次说明。
- 取单个元素的时候
- 取元素列表
- 使用loc进行切片的时候,需要考虑到其起点和终点。其切片会包含两端的值,如果唯一则运行,不唯一则会报错。
如果dataframe使用整数索引的时候,同样是对元素进行切片,而且包含两端,中间的索引不允许有重复值。 - 在loc里面加入布尔值进行判断,在以后的数据处理中目测会进行使用
可以使用isin
方法返回布尔列表,传入元素列表
卧槽,iloc真是改变我的数据切割的看法,使用复合条件配合咯从进行切割,数据很舒爽
select_dtypes
是一个实用函数,它能够从表中选出相应类型的列,若要选出所有数值型的列,只需使用.select_dtypes('number')
,请利用布尔列表选择的方法结合DataFrame
的dtypes
属性在learn_pandas
数据集上实现这个功能。
loc函数同时也支持像放自定义函数和匿名函数,但是函数的结果必须是和上图一样的条件。
iloc索引器
跟loc类似
query方法
在pandas中,可以通过query
方法,直接导入字符串形式来查询数据。每一个条件都使用了文本格式。
df.query('((School == "Fudan University")&'
' (Grade == "Senior")&'
' (Weight > 70))|'
'((School == "Peking University")&'
' (Grade != "Senior")&'
' (Weight > 80))')
用query基本上就是带上了用上了中文进行判别,直接就是英语判断,好家伙!但是必须是能够在loc页面能导出数据的语句。
Note
对于含有空格的列名,需要使用col name
的方式引用
看到上面这种语法,我尼玛人都懵了。
我爱query
随机抽样
在把dataframe作为一整个数据集的时候,把每一行看作一个样本而每一列看作一个特征。此时可以使用sample
进行抽样。有时在拿到大型数据集后,想要对统计特征进行计算来了解数据的大致分布,但是这很费时间。同时,由于许多统计特征在等概率不放回的简单随机抽样条件下,是总体统计特征的无偏估计,比如样本均值和总体均值,那么就可以先从整张表中抽出一部分来做近似估计。
sample
函数中的主要参数为n, axis, frac, replace, weights
,前三个分别是指抽样数量、抽样的方向(0为行、1为列)和抽样比例(0.3则为从总体中抽出30%的样本)。
replace
和weights
分别是指是否放回和每个样本的抽样相对概率,当replace = True
则表示有放回抽样。例如,对下面构造的df_sample
以value
值的相对大小为抽样概率进行有放回抽样,抽样数量为3。
二级索引
二级索引的构造与调取
此处构造二级索引的方式,将在下一次的笔记中展示,这里看到的行索引、列索引都是以Multiindex的形式,在图中可以看到,行索引和列索引只保留了出现一次的位置,这样增强了图表的可读性。
df_multi.index.names # 获取索引的名字
df_multi.index.values # 获取索引的值
df_multi.index.get_level_values(0) # 获得第一层的索引值
以上是取得多级索引的相关方法
在多级索引中使用loc方法
- 在对多级索引使用
loc
或是iloc
方法时,和之前的单级索引类似,之前之前传入的是标量,在多级索引中应当传入元组。
在取索引前应该对Multi Index进行排序,以避免性能警告。这句话并实施比很懂,可能经历的还不够多,没遭遇性能警告
df_multi = df_multi.sort_index()
df_multi.loc[('Fudan University', 'Junior')].head()
res = df_multi.loc[(['Peking University', 'Fudan University'], ['Sophomore', 'Junior']), :]
res.head()
以上的例子会根据输入的元组的条件多元素进行筛选。输入两列index进行筛选,然后:
输出其余的全部列。这种形式与一下的形式不同在于,上面传入的是元组即进行交叉组合,而下面这种情况则传入的列表,其对应生成的是北大大三的学生和复旦大二的学生。
IndexSlice对象
使用IndexSlice
进行分层切片,首先需要将进行定义,idx = pd.IndexSlice
其中按照loc[idx[*,*]]
的格式可以获取切片
其中的('D','f')
分别是对列的选择,这里的列有两个索引,所以需要两级放上去。
另外idx也可以输入布尔值
其中的x是指原数据表,先进行布尔值判断再进行切片。(表达顺序还是要捋清楚的,先是内部函数的表达,再到外面进行处理)。
以上的形式可以分别对行和列同时进行多层切片。
多级索引的构造
索引的常用方法
索引层的交换和删除
可以使用swaplevel
和reorder_levels
进行操作,由于说前者能做的后者也能做,前者不能做的后者还能做,于是这里暂时只介绍后一种办法:
先构造一个多维索引:
np.random.seed(0)
L1,L2,L3 = ['A','B'],['a','b'],['alpha','beta']
mul_index1 = pd.MultiIndex.from_product([L1,L2,L3], names=('Upper', 'Lower','Extra'))
L4,L5,L6 = ['C','D'],['c','d'],['cat','dog']
mul_index2 = pd.MultiIndex.from_product([L4,L5,L6], names=('Big', 'Small', 'Other'))
df_ex = pd.DataFrame(np.random.randint(-9,10,(8,8)), index=mul_index1, columns=mul_index2)
df_ex
df_ex.reorder_levels([2,0,1],axis=0).head() # 列表数字指代原来索引中的层
删除某一层索引可以使用droplevel 方法,其中输入的参数与reorder类似
索引属性的修改
# 这里索引层的名字的的修改使用rename_axis函数,输入的修改办法是传入字典参数
df_ex.rename_axis(index={'Upper':'Changed_row'}, columns={'Other':'Changed_Col'}).head()
# 使用rename对索引值进行修改,多层索引需要传入修改的层号
df_ex.rename(columns={'cat':'not_cat'}, level=2).head()
# 也可以再里面传入匿名函数,才发现匿名函数这么好用
df_ex.rename(index=lambda x:str.upper(x), level=2).head()