experiment-03-实验三 pandas的基本使用

实验三 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
nameageht
101zs231.60
102ls241.70
103ww221.65
104zl251.82
105lq211.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]]
01
001
123
245
367
489
(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']]
nameage
101zs23
102ls24
103ww22
104zl25
105lq21

③ 使用索引切片查看“101”至“103”行的内容,输出结果如下所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-avF0Fujh-1669126612797)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%204.png)]

member[:'103']
nameageht
101zs231.60
102ls241.70
103ww221.65

④ 使用loc方法和iloc方法查看“101”和“103”行的内容,输出结果如下所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcNZmxLJ-1669126612797)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%205.png)]

member.loc[['101','103']]
nameageht
101zs231.60
103ww221.65
member.iloc[[0,2]]
nameageht
101zs231.60
103ww221.65

⑤ 使用loc方法和iloc方法查看“102” 和“name”的内容,输出结果如下所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b6avMxHD-1669126612797)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%206.png)]

member.loc[['102'],['name']]
name
102ls
member.iloc[[1],[0]]
name
102ls

⑥ 使用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']]
nameht
101zs1.60
103ww1.65
member.iloc[[0,2],[0,2]]
nameht
101zs1.60
103ww1.65
(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
nameagehtwtgender
101zs231.6055f
102ls241.7060m
103ww221.6570f
104zl251.8268m
105lq211.7257m

② 修改“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
nameagehtweightgender
101zs231.6055f
102ls241.7060m
103ww221.6570f
104zl251.8268m
105lq211.7257m

③ 删除列“gender”。 输出结果如下所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McQZqCf1-1669126612799)(experiment-03-three-pic/%E5%9B%BE%E7%89%87%2010.png)]

del member['gender']
member
nameagehtweight
101zs231.6055
102ls241.7060
103ww221.6570
104zl251.8268
105lq211.7257

(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
ClassMajorName
1011networkZhang San
1022networkLi Si
1033hardwareWang Laowu
1041hardwareZhao Liu
1052softwareQian Qi
1062hardwareSun Ba
1072hardwareHu 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
NameScoreSubject
101Zhang San98Python
102Li Si76C++
103Wang Laowu84Python
104Zhao Liu70C++
105Qian Qi93Python
106Sun Ba83Java

② 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
ClassMajorName
1041hardwareZhao Liu
1062hardwareSun Ba
1072hardwareHu Jiu
1033hardwareWang Laowu
1011networkZhang San
1022networkLi Si
1052softwareQian Qi
scoresheet.sort_values(by='Score',axis=0,ascending=False,inplace=True)
scoresheet
NameScoreSubject
101Zhang San98Python
105Qian Qi93Python
103Wang Laowu84Python
106Sun Ba83Java
102Li Si76C++
104Zhao Liu70C++

③ scoresheet中修改‘zhao Liu’和‘Qian Qi’的‘Score’值为98,并返回学生的‘Score’降序排名,排名相同时取最小排名,输出结果如下所示。

scoresheet.iloc[1,1]=98
scoresheet.iloc[5,1]=98
scoresheet.sort_index()
NameScoreSubject
101Zhang San98Python
102Li Si76C++
103Wang Laowu84Python
104Zhao Liu98C++
105Qian Qi98Python
106Sun Ba83Java
scoresheet.sort_values(by=['Score']).rank(method="min",ascending=False).sort_index()
NameScoreSubject
1012.01.01.0
1026.06.05.0
1033.04.01.0
1041.01.05.0
1055.01.01.0
1064.05.04.0

④ scoresheet按‘Subject’分组,查看‘Python’分组信息,并对三门课程的‘Score’进行描述统计分析,输出结果如下所示。

scoresheet.groupby('Subject').get_group('Python')
NameScoreSubject
101Zhang San98Python
105Qian Qi98Python
103Wang Laowu84Python
scoresheet.groupby('Subject').describe()
Score
countmeanstdmin25%50%75%max
Subject
C++2.087.00000015.55634976.081.587.092.598.0
Java1.083.000000NaN83.083.083.083.083.0
Python3.093.3333338.08290484.091.098.098.098.0

⑤ 使用concat函数将stu和scorsheet横向合并,输出结果如下所示。

pd.concat([stu,scoresheet],axis=1).sort_index()

ClassMajorNameNameScoreSubject
1011networkZhang SanZhang San98.0Python
1022networkLi SiLi Si76.0C++
1033hardwareWang LaowuWang Laowu84.0Python
1041hardwareZhao LiuZhao Liu98.0C++
1052softwareQian QiQian Qi98.0Python
1062hardwareSun BaSun Ba83.0Java
1072hardwareHu JiuNaNNaNNaN

⑥ 使用merge函数将stu和scoresheet按‘Name’关键字合并,输出结果如下所示。

pd.merge(stu.sort_index(),scoresheet.sort_index(),on='Name')
ClassMajorNameScoreSubject
01networkZhang San98Python
12networkLi Si76C++
23hardwareWang Laowu84Python
31hardwareZhao Liu98C++
42softwareQian Qi98Python
52hardwareSun Ba83Java
(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
ClassMajorNameClass_name
1011networkZhang San17物联网1班
1022networkLi Si17物联网2班
1033hardwareWang Laowu17物联网3班
1041hardwareZhao Liu17物联网1班
1052softwareQian Qi17物联网2班
1062hardwareSun Ba17物联网2班
1072hardwareHu Jiu17物联网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
ClassMajorNameClass_name
1022networkLi Si17物联网2班
1052softwareQian Qi17物联网2班
1062hardwareSun Ba17物联网2班
1072hardwareHu Jiu17物联网2班
1033hardwareWang Laowu17物联网3班
1011networkZhang San17物联网1班
1041hardwareZhao Liu17物联网1班

③ scoresheet中修改‘Zhao Liu’和‘Qian Qi’的‘Score’值为缺失值,并使用线性插值法填充该缺失值,输出结果如下所示。

scoresheet.iloc[3,1]=None
scoresheet.iloc[4,1]=None
scoresheet.interpolate().sort_index()
NameScoreSubject
101Zhang San98.000000Python
102Li Si76.000000C++
103Wang Laowu84.000000Python
104Zhao Liu83.666667C++
105Qian Qi83.333333Python
106Sun Ba83.000000Java
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值