实验三 pandas的基本使用
1.实验内容
(1)pandas的导入。 (2)创建Series对象和DataFrame数据表。 (3)DataFrame数据表索引与切片。 (4)DataFrame数据表添加删除行列的操作。 (5)DataFrame数据表的排序、排名、分组和合并操作。 (6)DataFrame数据表的分类数据的转换和赋值及缺失值的处理。
2.目的要求
(1)学会pandas的导入。 (2)掌握Series和DataFrae数据表的创建。 (3)掌握DataFrame数据表索引与切片方法。 (4)掌握DataFrame添加删除行列的操作。 (5)掌握DataFrame数据表的排序、排名、分组和合并操作。 (6)掌握DataFrame数据表的分类数据的转换和赋值及缺失值的处理方法。
3.实验方法手段及其条件
(1)编写程序完成Series和DataFrame对象的基本创建。
① 根据列表[2, 8, -5, 6, 7]创建Series对象s1并显示。
import pandas as pd
import numpy as np
s1= pd. Series( [ 2 , 8 , - 5 , 6 , 7 ] )
s1
0 2
1 8
2 -5
3 6
4 7
dtype: int64
② 为列表[2, 8, -5, 6, 7]指定索引值[‘d’, ‘b’, ‘a’, ‘c’, ‘e’], 创建Series对象s2,显示s2并使用index和values属性查看s2索引名和值。
s2= pd. Series( [ 2 , 8 , - 5 , 6 , 7 ] , index= [ 'd' , 'b' , 'a' , 'c' , 'e' ] )
s2
d 2
b 8
a -5
c 6
e 7
dtype: int64
s2. index
Index(['d', 'b', 'a', 'c', 'e'], dtype='object')
s2. values
array([ 2, 8, -5, 6, 7], dtype=int64)
③ 字典对象data定义如下: data = {‘name’: [‘zs’,‘ls’,‘ww’,‘zl’,‘lq’],‘age’: [23,24,22,25,21],‘ht’: [1.6,1.7,1.65,1.82,1.72]} 使用字典对象data创建DataFrame对象member,行索引值为[‘101’,‘102’,‘103’,‘104’, ‘105’]。member输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZ1Qv6FQ-1669126612795)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%201.png)] 要求:显示member并使用columns、index和values属性查看member的列索引名、行索引名和值。
data = { 'name' : [ 'zs' , 'ls' , 'ww' , 'zl' , 'lq' ] ,
'age' : [ 23 , 24 , 22 , 25 , 21 ] ,
'ht' : [ 1.6 , 1.7 , 1.65 , 1.82 , 1.72 ]
}
member= pd. DataFrame( data)
member. index= [ '101' , '102' , '103' , '104' , '105' ]
member
name age ht 101 zs 23 1.60 102 ls 24 1.70 103 ww 22 1.65 104 zl 25 1.82 105 lq 21 1.72
member. columns
Index(['name', 'age', 'ht'], dtype='object')
member. index
Index(['101', '102', '103', '104', '105'], dtype='object')
member. values
array([['zs', 23, 1.6],
['ls', 24, 1.7],
['ww', 22, 1.65],
['zl', 25, 1.82],
['lq', 21, 1.72]], dtype=object)
④ 根据numpy的ndarray对象np1创建DataFrame对象d2并显示d2。 np1=np.arange(10).reshape(5,2)
import numpy as np
np1= np. arange( 10 ) . reshape( 5 , 2 )
print ( np1)
d2= pd. DataFrame( np1)
d2
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
(2)编写程序完成DataFrame数据表对象member的索引与切片的操作。
① 使用列表列名索引方法查看“name”列的内容,输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lC2C77UL-1669126612796)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%202.png)]
member. name
101 zs
102 ls
103 ww
104 zl
105 lq
Name: name, dtype: object
member[ 'name' ]
101 zs
102 ls
103 ww
104 zl
105 lq
Name: name, dtype: object
② 使用列表列名索引方法查看“name”和“age”列的内容,输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPhVFh71-1669126612796)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%203.png)]
member[ [ 'name' , 'age' ] ]
name age 101 zs 23 102 ls 24 103 ww 22 104 zl 25 105 lq 21
③ 使用索引切片查看“101”至“103”行的内容,输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-avF0Fujh-1669126612797)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%204.png)]
member[ : '103' ]
name age ht 101 zs 23 1.60 102 ls 24 1.70 103 ww 22 1.65
④ 使用loc方法和iloc方法查看“101”和“103”行的内容,输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcNZmxLJ-1669126612797)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%205.png)]
member. loc[ [ '101' , '103' ] ]
name age ht 101 zs 23 1.60 103 ww 22 1.65
member. iloc[ [ 0 , 2 ] ]
name age ht 101 zs 23 1.60 103 ww 22 1.65
⑤ 使用loc方法和iloc方法查看“102” 和“name”的内容,输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b6avMxHD-1669126612797)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%206.png)]
member. loc[ [ '102' ] , [ 'name' ] ]
member. iloc[ [ 1 ] , [ 0 ] ]
⑥ 使用loc方法和iloc方法查看“101”和“103”对应的“name”和“ht”的内容,输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOGntwJQ-1669126612798)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%207.png)]
member. loc[ [ '101' , '103' ] , [ 'name' , 'ht' ] ]
member. iloc[ [ 0 , 2 ] , [ 0 , 2 ] ]
(3)编写程序完成DataFrame数据表对象member的列/行添加删除操作。
① 追加列“wt”: [55, 60, 70, 68, 57]和“gender”: [‘f’,‘m’,‘f’,‘m’,‘m’],输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6s4Ayed7-1669126612798)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%208.png)]
member[ 'wt' ] = [ 55 , 60 , 70 , 68 , 57 ]
member[ 'gender' ] = [ 'f' , 'm' , 'f' , 'm' , 'm' ]
member
name age ht wt gender 101 zs 23 1.60 55 f 102 ls 24 1.70 60 m 103 ww 22 1.65 70 f 104 zl 25 1.82 68 m 105 lq 21 1.72 57 m
② 修改“wt”列名为“weight”。输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RnM3WAAg-1669126612799)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%209.png)]
member. rename( columns= { 'wt' : 'weight' } , inplace= True )
member
name age ht weight gender 101 zs 23 1.60 55 f 102 ls 24 1.70 60 m 103 ww 22 1.65 70 f 104 zl 25 1.82 68 m 105 lq 21 1.72 57 m
③ 删除列“gender”。 输出结果如下所示。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McQZqCf1-1669126612799)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%2010.png)]
del member[ 'gender' ]
member
name age ht weight 101 zs 23 1.60 55 102 ls 24 1.70 60 103 ww 22 1.65 70 104 zl 25 1.82 68 105 lq 21 1.72 57
(4)编写程序完成DataFrame数据表对象stu和scoresheet的排序、排名、分组和合并操作。
① 创建DataFrame数据表对象stu和scoresheet,如下所示。
str_stu= {
'Class' : [ 1 , 2 , 3 , 1 , 2 , 2 , 2 ] ,
'Major' : [ 'network ' , 'network ' , 'hardware' , 'hardware' , 'software ' , 'hardware' , 'hardware' ] ,
'Name' : [ 'Zhang San' , 'Li Si' , 'Wang Laowu' , 'Zhao Liu' , 'Qian Qi' , 'Sun Ba' , 'Hu Jiu' ]
}
stu= pd. DataFrame( str_stu)
stu. index= [ 101 , 102 , 103 , 104 , 105 , 106 , 107 ]
stu
Class Major Name 101 1 network Zhang San 102 2 network Li Si 103 3 hardware Wang Laowu 104 1 hardware Zhao Liu 105 2 software Qian Qi 106 2 hardware Sun Ba 107 2 hardware Hu Jiu
str_scoresheet= {
'Name' : [ 'Zhang San' , 'Li Si' , 'Wang Laowu' , 'Zhao Liu' , 'Qian Qi' , 'Sun Ba' ] ,
'Score' : [ 98 , 76 , 84 , 70 , 93 , 83 ] ,
'Subject' : [ 'Python' , 'C++' , 'Python' , 'C++' , 'Python' , 'Java' ]
}
scoresheet= pd. DataFrame( str_scoresheet)
scoresheet. index= [ 101 , 102 , 103 , 104 , 105 , 106 ]
scoresheet
Name Score Subject 101 Zhang San 98 Python 102 Li Si 76 C++ 103 Wang Laowu 84 Python 104 Zhao Liu 70 C++ 105 Qian Qi 93 Python 106 Sun Ba 83 Java
② stu按‘Major’和‘Class’升序排列,scoresheet按‘Score’降序排列,输出结果如下所示。 inplace=True表示对原始DataFrame本身操作,因此不需要赋值操作,inplace=False相当于是对原始DataFrame的拷贝,之后的一些操作都是针对这个拷贝文件进行操作的,因此需要我们赋值给一个变量,保存操作后的结果。
stu. sort_values( by= [ 'Major' , 'Class' ] , axis= 0 , ascending= [ True , True ] , inplace= True )
stu
Class Major Name 104 1 hardware Zhao Liu 106 2 hardware Sun Ba 107 2 hardware Hu Jiu 103 3 hardware Wang Laowu 101 1 network Zhang San 102 2 network Li Si 105 2 software Qian Qi
scoresheet. sort_values( by= 'Score' , axis= 0 , ascending= False , inplace= True )
scoresheet
Name Score Subject 101 Zhang San 98 Python 105 Qian Qi 93 Python 103 Wang Laowu 84 Python 106 Sun Ba 83 Java 102 Li Si 76 C++ 104 Zhao Liu 70 C++
③ scoresheet中修改‘zhao Liu’和‘Qian Qi’的‘Score’值为98,并返回学生的‘Score’降序排名,排名相同时取最小排名,输出结果如下所示。
scoresheet. iloc[ 1 , 1 ] = 98
scoresheet. iloc[ 5 , 1 ] = 98
scoresheet. sort_index( )
Name Score Subject 101 Zhang San 98 Python 102 Li Si 76 C++ 103 Wang Laowu 84 Python 104 Zhao Liu 98 C++ 105 Qian Qi 98 Python 106 Sun Ba 83 Java
scoresheet. sort_values( by= [ 'Score' ] ) . rank( method= "min" , ascending= False ) . sort_index( )
Name Score Subject 101 2.0 1.0 1.0 102 6.0 6.0 5.0 103 3.0 4.0 1.0 104 1.0 1.0 5.0 105 5.0 1.0 1.0 106 4.0 5.0 4.0
④ scoresheet按‘Subject’分组,查看‘Python’分组信息,并对三门课程的‘Score’进行描述统计分析,输出结果如下所示。
scoresheet. groupby( 'Subject' ) . get_group( 'Python' )
Name Score Subject 101 Zhang San 98 Python 105 Qian Qi 98 Python 103 Wang Laowu 84 Python
scoresheet. groupby( 'Subject' ) . describe( )
Score count mean std min 25% 50% 75% max Subject C++ 2.0 87.000000 15.556349 76.0 81.5 87.0 92.5 98.0 Java 1.0 83.000000 NaN 83.0 83.0 83.0 83.0 83.0 Python 3.0 93.333333 8.082904 84.0 91.0 98.0 98.0 98.0
⑤ 使用concat函数将stu和scorsheet横向合并,输出结果如下所示。
pd. concat( [ stu, scoresheet] , axis= 1 ) . sort_index( )
Class Major Name Name Score Subject 101 1 network Zhang San Zhang San 98.0 Python 102 2 network Li Si Li Si 76.0 C++ 103 3 hardware Wang Laowu Wang Laowu 84.0 Python 104 1 hardware Zhao Liu Zhao Liu 98.0 C++ 105 2 software Qian Qi Qian Qi 98.0 Python 106 2 hardware Sun Ba Sun Ba 83.0 Java 107 2 hardware Hu Jiu NaN NaN NaN
⑥ 使用merge函数将stu和scoresheet按‘Name’关键字合并,输出结果如下所示。
pd. merge( stu. sort_index( ) , scoresheet. sort_index( ) , on= 'Name' )
Class Major Name Score Subject 0 1 network Zhang San 98 Python 1 2 network Li Si 76 C++ 2 3 hardware Wang Laowu 84 Python 3 1 hardware Zhao Liu 98 C++ 4 2 software Qian Qi 98 Python 5 2 hardware Sun Ba 83 Java
(5)编写程序完成DataFrame数据表对象stu和scoresheet的分类数据和缺失数据操作。
① 设置DataFrame数据表对象stu的“Class”列为category类型数据, 追加列“Class_name”其对应“Class”列的值:1-17物联网1班、2-17物联网2班、3-17物联网3班,输出结果如下所示。
stu[ 'Class' ] . astype( 'category' )
101 1
102 2
103 3
104 1
105 2
106 2
107 2
Name: Class, dtype: category
Categories (3, int64): [1, 2, 3]
Class_name = pd. DataFrame( { 'Class' : [ 1 , 2 , 3 ] ,
'Class_name' : [ '17物联网1班' , '17物联网2班' , '17物联网3班' ] } ,
index= [ 101 , 102 , 103 ] , dtype= 'category' )
stu_Class_name = pd. merge( stu, Class_name, on= 'Class' , how= 'left' , indicator= False , validate= None )
stu_Class_name. index= [ 101 , 102 , 103 , 104 , 105 , 106 , 107 ]
stu_Class_name
Class Major Name Class_name 101 1 network Zhang San 17物联网1班 102 2 network Li Si 17物联网2班 103 3 hardware Wang Laowu 17物联网3班 104 1 hardware Zhao Liu 17物联网1班 105 2 software Qian Qi 17物联网2班 106 2 hardware Sun Ba 17物联网2班 107 2 hardware Hu Jiu 17物联网2班
② 按照“Class_name”排序,要求排序顺序为: ‘17物联网2班’,‘17物联网3班’,‘17物联网1班’,输出结果如下所示。
stu_Class_name[ 'Class_name' ] = stu_Class_name[ 'Class_name' ] . cat. set_categories( [ '17物联网2班' , '17物联网3班' , '17物联网1班' ] )
stu_Class_name_1 = stu_Class_name. sort_values( by= [ 'Class_name' ] , ascending= True )
stu_Class_name_1
Class Major Name Class_name 102 2 network Li Si 17物联网2班 105 2 software Qian Qi 17物联网2班 106 2 hardware Sun Ba 17物联网2班 107 2 hardware Hu Jiu 17物联网2班 103 3 hardware Wang Laowu 17物联网3班 101 1 network Zhang San 17物联网1班 104 1 hardware Zhao Liu 17物联网1班
③ scoresheet中修改‘Zhao Liu’和‘Qian Qi’的‘Score’值为缺失值,并使用线性插值法填充该缺失值,输出结果如下所示。
scoresheet. iloc[ 3 , 1 ] = None
scoresheet. iloc[ 4 , 1 ] = None
scoresheet. interpolate( ) . sort_index( )
Name Score Subject 101 Zhang San 98.000000 Python 102 Li Si 76.000000 C++ 103 Wang Laowu 84.000000 Python 104 Zhao Liu 83.666667 C++ 105 Qian Qi 83.333333 Python 106 Sun Ba 83.000000 Java