一、索引
1.切片的用法
用于取出两个索引的中间值,返回会包含切片的两个端点,如下所示:
s = pd.Series([1, 2, 3, 4, 5, 6], index=['a', 'b', 'a', 'a', 'a', 'c'])
s['b':'c']
Out[133]:
b 2
a 3
a 4
a 5
c 6
dtype: int64
此时将端点b和c也一并进行了返回。因为所有的索引中具有唯一的'b'和'c',所以不会报错。
若要对重复索引进行切片,例如a,则要先排序后再进行切片
s.sort_index()['a': 'b']
Out[14]:
a 1
a 3
a 4
a 5
b 2
dtype: int64
对整数索引切片时,取出的是位置的值,例如:
s = pd.Series(['pig','pig','dog','cat'],index=(1,3,4,2))
s
Out[136]:
1 pig
3 pig
4 dog
2 cat
dtype: object
s[3:4]
Out[137]:
2 cat
dtype: object
取出来的是第四个元素,但对某一行索引时,还是和之前一样:
s[3]
Out[139]: 'pig'
2.loc和iloc
loc有两个输入,第一个输入为行,第二个输入为列。对于整数索引,直接切片时,结果如下:
df
Out[148]:
School Grade Name
5 Shanghai Jiao Tong University Freshman Gaopeng Yang
4 Peking University Freshman Changqiang You
3 Shanghai Jiao Tong University Senior Mei Sun
2 Fudan University Sophomore Xiaojuan Sun
1 Fudan University Sophomore Gaojuan You
df[5:3]
Out[149]:
Empty DataFrame
Columns: [School, Grade, Name]
Index: []
得出的结论和之前相同,不使用任何函数,直接切片时是按位置进行切片的,但使用loc切片时,结果如下:
df.loc[5:3]
Out[150]:
School Grade Name
5 Shanghai Jiao Tong University Freshman Gaopeng Yang
4 Peking University Freshman Changqiang You
3 Shanghai Jiao Tong University Senior Mei Sun
说明使用loc切片时,是对索引值进行切片,且切片包含端点。
iloc与loc基本一致,但是是针对位置进行索引。
用ilco对整数索引进行切片:
df.iloc[5:3]
Out[151]:
Empty DataFrame
Columns: [School, Grade, Name]
Index: []
df.iloc[3:5]
Out[152]:
School Grade Name
2 Fudan University Sophomore Xiaojuan Sun
1 Fudan University Sophomore Gaojuan You
由此可知切片是对位置进行切片,且不包含结束的端点。
在使用布尔列表的时候要特别注意,不能传入 Series
而必须传入序列的 values
,如下:
df.iloc[(df.School=='Fudan University').values]
Out[155]:
School Grade Name
2 Fudan University Sophomore Xiaojuan Sun
1 Fudan University Sophomore Gaojuan You
使用loc可以直接传入Series:
df.loc[(df.School=='Fudan University')]
Out[157]:
School Grade Name
2 Fudan University Sophomore Xiaojuan Sun
1 Fudan University Sophomore Gaojuan You
且loc加不加values均可:
df.loc[(df.School=='Fudan University').values]
Out[156]:
School Grade Name
2 Fudan University Sophomore Xiaojuan Sun
1 Fudan University Sophomore Gaojuan You
总结一下iloc和loc的区别:
-
使用loc切片时,是对索引值进行切片,且切片包含两个端点。iloc切片是对位置进行切片,且不包含结束的端点。
-
在使用布尔列表的时,iloc不能传入
Series
而必须传入序列的values
,loc传入两者均可
3.随机抽样
- 抽样函数resample,主要参数为replace,表示有无放回;weights,表示每个样本抽样的概率 , 例如:
df_sample
Out[159]:
id value
0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
有放回的均匀抽样可以写作:
df_sample.sample(3,replace =True,weights=np.ones(5)) #weights相同即可代表均匀抽样
二、多级索引
多级索引顾名思义,就是列和行不再是单一的一个属性,而是多个属性。进行索引时使用元组索引。
切片
先构造多级索引
df.set_index(['School','Grade'])
Out[170]:
Name
School Grade
Shanghai Jiao Tong University Freshman Gaopeng Yang
Peking University Freshman Changqiang You
Shanghai Jiao Tong University Senior Mei Sun
Fudan University Sophomore Xiaojuan Sun
Sophomore Gaojuan You
切片时,无论元组在索引中是否重复出现,都必须经过排序才能使用切片,例如:
df.loc[('Shanghai Jiao Tong University'):]
UnsortedIndexError: 'Key length (1) was greater than MultiIndex lexsort depth (0)'
排序后:
df_sorted = df.sort_index()
df_sorted.loc[('Shanghai Jiao Tong University'):]
Out[194]:
Name
School Grade
Shanghai Jiao Tong University Freshman Gaopeng Yang
Senior Mei Sun
三、索引的操作与运算
1.交换和删除
- swaplevel(0,2,axis=1) :只能交换两个,表示交换列索引的第三个和第一个
- recorder_levels([2,1,0],axis=0) :可以交换任意个,表示交换行索引的第一个和第三个
- dropleve([0,1],axis=1) :表示删除第一和第二列
2.索引属性的修改
- renam_axis :对索引层的名字修改
- rename :对索引的值修改
3.索引设置和重置
- set_index :设置索引
- reset_index : 进行重置
4.索引的变形
- reindex:用来扩展表格
- reindex_like:其功能是仿照传入的表的索引来进行被调用表索引的变形