小白也能看懂的Pandas实操演示教程(下)
作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了解初学者学习过程的需求和问题,希望通过这个专栏能够广结好友,共同成长。
编辑:王老湿
5 pandas实现SQL操作
pandas实现对数据的增删改查
增:添加新行或增加新列
dict={'Name':['LiuShunxiang','Zhangshan'],'Sex':['M','F'],'Age':[27,23],'Height':[165.7,167.2],'weight':[61,63]}
print(dict)
student1=pd.DataFrame(dict)
print(student1)dict={'Name':['Liu','Zhang'],'Sex':['M','F'],'Age':[27,23],'Height':[165.7,167.2],'weight':[61,63]}
student2=pd.DataFrame(dict)
{'Name': ['LiuShunxiang', 'Zhangshan'], 'Sex': ['M', 'F'], 'Age': [27, 23], 'Height': [165.7, 167.2], 'weight': [61, 63]}Age Height Name Sex weight
0 27 165.7 LiuShunxiang M 61
1 23 167.2 Zhangshan F 63
将student2中的数据新增到student1中,可以通过concat函数实现,concat函数对index无视
student3=pd.concat([student1,student2],ignore_index='Ture')
student3
添加新列---增加的新列没有赋值,就会出现NAN的形式
pd.DataFrame(student2,columns=['Age','Heught','Name','Sex','weight','Score'])
删:删除表、观测行或变量列
删除整个数据框
del student2
student2
---------------------------------------------------------------------------NameError Traceback (most recent call last)<ipython-input-61-dbecb61e032f> in <module>()
----> 1 student2NameError: name 'student2' is not defined
删除指定行
student3.drop([0])
删除25岁以上的学生
student3[student3['Age']<25]
删除指定的列
student3.drop(['Height','weight'],axis=1)
不论删除行还是列,都可以通过drop方法实现,只需要设定好删除的轴即可,即调整drop方法中的axis参数。默认参数为0,即删除行观测数据,如果需要删除列变量,则需要设置为1.
改:修改原始记录的值
如果发现表中的数据错了,如何更改原来的值呢?尝试结合布尔索引和赋值的方法
student3
假设需要修改liu学生的身高为173
student3.loc[student3['Name']=='Liu','Height']=173
student3
查:类似上边的数据查询部分
聚合:groupby()
student3.groupby('Sex').mean()
多个分组变量,例如根据年龄和性别分组,计算身高和体重的平均值
student3.groupby(['Sex','Age']).mean()
对每个分组计算多个统计量
student3.drop('Age',axis=1).groupby('Sex').agg([np.mean,np.median])
排序:sort_values
series=pd.Series(np.array(np.random.randint(1,20,10)))
series
0 3
1 13
2 13
3 17
4 5
5 15
6 17
7 15
8 4
9 16
dtype: int32
默认按值升序排列
series.sort_values()
0 3
8 4
4 5
1 13
2 13
5 15
7 15
9 16
3 17
6 17
dtype: int32
按降序排列
series.sort_values(ascending=False)
6 17
3 17
9 16
7 15
5 15
2 13
1 13
4 5
8 4
0 3
dtype: int32
数据框中按值排列
student3.sort_values(by=['Sex','Age'])
多表链接-merge
dict2={'Name':['Alfred','Alice','Barbara','Carol','Henry','Jeffrey','Judy','Philip','Robert','william'],'Score':[88,76,89,67,79,90,92,86,73,77]}
score=pd.DataFrame(dict2)
score
student3['Name']=['Alfred','Alice','Barbara','Carol']
student3
把学生表和成绩表做一个关联,默认情况下实现的是两个表之间的内连接,即返回两张表中共同部分的数据
stu_score1=pd.merge(student3,score,on='Name')
stu_score1
stu_score1=pd.merge(student3,score,on='Name',how='inner')
stu_score1
使用how参数设置连接的方式,left为左连接,right为右连接,outer为外连接
stu_score2=pd.merge(student3,score,on='Name',how='left')
stu_score2
保留score表中的所有信息,同时将student3表的信息与之配对,能配多少配多少,对于没有配上的score,将会显示Nan
stu_score3=pd.merge(student3,score,on='Name',how='right')
stu_score3
stu_score4=pd.merge(student3,score,on='Name',how='outer')
stu_score4
6 对缺失值的处理
现实中的数据存在很多噪音的同时,缺失值也非常的常见。缺失值的存在会影响后期的数据分析或挖掘工作,那么缺失值的处理有哪些方法呢?
6.1 删除法
当数据中某个变量大部分值都会缺失值时,可以考虑删除该变量; 默认情况下,dropna会删除任何含有缺失值的行, 构造个数据框
df=pd.DataFrame([[1,1,2],[3,5,np.nan],[13,21,34],[55,np.nan,10],[np.nan,np.nan,np.nan],[np.nan,1,2]],columns=['x1','x2','x3'])
df
df.dropna()
只删除所有行为缺失值的观测
df=pd.DataFrame([[1,1,2],[3,5,np.nan],[13,21,34],[55,np.nan,10],[np.nan,np.nan,np.nan],[np.nan,1,2]],columns=['x1','x2','x3'])
df.dropna(how='all')
删除有行为缺失值的观测,
df=pd.DataFrame([[1,1,2],[3,5,np.nan],[13,21,34],[55,np.nan,10],[np.nan,np.nan,np.nan],[np.nan,1,2]],columns=['x1','x2','x3'])
df.dropna(how='any')
删除全为nan的那些列
df=pd.DataFrame([[1,1,2,np.nan],[3,5,np.nan,np.nan],[13,21,34,np.nan],[55,np.nan,10,np.nan],[np.nan,np.nan,np.nan,np.nan],[np.nan,1,2,np.nan]],columns=['x1','x2','x3','x4'])
print(df)
df.dropna(how='all',axis=1)
x1 x2 x3 x4
0 1.0 1.0 2.0 NaN
1 3.0 5.0 NaN NaN
2 13.0 21.0 34.0 NaN
3 55.0 NaN 10.0 NaN
4 NaN NaN NaN NaN
5 NaN 1.0 2.0 NaN
利用thresh,保留一些为nan的值
行方向上至少有3个非NAN的项保留
df=pd.DataFrame([[1,1,2,np.nan],[3,5,np.nan,np.nan],[13,21,34,np.nan],[55,np.nan,10,np.nan],[np.nan,np.nan,np.nan,np.nan],[np.nan,1,2,np.nan]],columns=['x1','x2','x3','x4'])
df.dropna(thresh=3)
df=pd.DataFrame([[1,1,2,np.nan],[3,5,np.nan,np.nan],[13,21,34,np.nan],[55,np.nan,10,np.nan],[np.nan,np.nan,np.nan,np.nan],[np.nan,1,2,np.nan]],columns=['x1','x2','x3','x4'])
df.dropna(thresh=1)
在列方向上至少保留有3个非NAN的项保留
df=pd.DataFrame([[1,1,2,np.nan],[3,5,np.nan,np.nan],[13,21,34,np.nan],[55,np.nan,10,np.nan],[np.nan,np.nan,np.nan,np.nan],[np.nan,1,2,np.nan]],columns=['x1','x2','x3','x4'])
df.dropna(thresh=3,axis=1)
6.2 替补法
对于连续变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;
fillna函数的参数:
value:用于填充缺失值的标量值或者字典对象
使用一个常量来填补缺失值,可以使用fillna函数实现简单的填补工作
1.用0填补所有缺失值
df.fillna(0)
2.采用前项填充或后项填充,用一个观测值填充
df.fillna(method='ffill')
用后一个观测值填充--这样会导致最后边的无法填充Nan
df.fillna(method='bfill')
3.使用常量填充不同的列
df.fillna({'x1':1,'x2':2,'x3':3})
4.使用均值或中位数填充各自的列
x1_median=df['x1'].median()
x2_mean=df['x2'].mean()
x3_mean=df['x3'].mean()
print(x1_median,x2_mean,x3_mean)
8.0 7.0 12.0
df.fillna({'x1':x1_median,'x2':x2_mean,'x3':x3_mean})
使用填充法时,相对于常数填充或者前项、后项填充,使用各列众数,均值或中位数填充要更加合理些,这也是工作中常用的一个快捷手段。
7 实现excel的数据透视表功能
pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',
data:需要进行数据透视表操作的数据框
test_data.head()
marital作为分组变量,balance作为数值变量做统计汇总
pd.pivot_table(test_data,values=['balance'],columns=['marital'])
marital作为1个分组变量,balance,housing作为两个数值变量做统计汇总
pd.pivot_table(test_data,values=['balance','housing'],columns=['marital'])
marital,job作为2个分组变量,balance作为1个数值变量做统计汇总
pd.pivot_table(test_data,values=['balance','housing'],columns=['marital','job'])
marital job
balance 1 1 1228.4936712 1785.3912723 2353.9515014 845.0000005 1243.9567016 977.8055567 1364.4326028 1243.5859389 1579.08108110 1952.57854411 1270.04098412 1749.9750002 1 1355.3333332 1501.2681483 1890.9000004 1205.8093225 1438.1891476 878.8736067 1236.7684488 1047.8125009 1716.30693110 1367.69473711 2158.58000012 814.8333333 1 1166.6739132 1801.1764713 1454.9901964 2946.0000005 962.7841416 940.809917...
housing 1 7 1.6018818 1.7253619 1.45945910 1.47509611 1.57377012 1.0000002 1 1.3939392 1.4829633 1.3000004 1.2415255 1.5333336 1.6765807 1.5877868 1.7083339 1.25742610 1.45263211 1.54000012 1.0555563 1 1.2391302 1.5330883 1.2352944 1.0000005 1.5506616 1.6280997 1.6576098 1.7055219 1.51351410 1.45714311 1.57142912 1.500000
Length: 72, dtype: float64
marital,job作为2个分组变量,balance,housing作为两个数值变量做统计汇总
pd.pivot_table(test_data,values=['balance','housing'],columns=['marital','job'])
marital job
balance 1 1 1228.4936712 1785.3912723 2353.9515014 845.0000005 1243.9567016 977.8055567 1364.4326028 1243.5859389 1579.08108110 1952.57854411 1270.04098412 1749.9750002 1 1355.3333332 1501.2681483 1890.9000004 1205.8093225 1438.1891476 878.8736067 1236.7684488 1047.8125009 1716.30693110 1367.69473711 2158.58000012 814.8333333 1 1166.6739132 1801.1764713 1454.9901964 2946.0000005 962.7841416 940.809917...
housing 1 7 1.6018818 1.7253619 1.45945910 1.47509611 1.57377012 1.0000002 1 1.3939392 1.4829633 1.3000004 1.2415255 1.5333336 1.6765807 1.5877868 1.7083339 1.25742610 1.45263211 1.54000012 1.0555563 1 1.2391302 1.5330883 1.2352944 1.0000005 1.5506616 1.6280997 1.6576098 1.7055219 1.51351410 1.45714311 1.57142912 1.500000
Length: 72, dtype: float64
很显然,这样的结果并不想Excel中预期的那样,该如何变成列联表的形式呢?很简单,只需将结果进行非堆叠操作即可。
pd.pivot_table(test_data,values=['balance','housing'],columns=['marital','job']).unstack()
这样的结果看起来更舒服一些
使用多个聚合函数
pd.pivot_table(test_data,values=['balance','housing'],columns=['marital'],aggfunc=[np.mean,np.median,np.std])
8 多层索引的使用
接下再讲一个Pandas中的重要功能,那就是多层索引。
Series的多层索引
s=pd.Series([1,2,3,4],index=[['小张','小张','老王','老王'],['期中','期末','期中','期末']])
s
小张 期中 1期末 2
老王 期中 3期末 4
dtype: int64
取回最外层索引为‘小张’的所有数据
s[['小张']]
小张 期中 1期末 2
dtype: int64
取回最内层所有为‘期中’的数据
s[:,'期中']
小张 1
老王 3
dtype: int64
将多层次索引的序列转换为数据框的形式
s.unstack()
期中 | 期末 | |
---|---|---|
小张 | 1 | 2 |
老王 | 3 | 4 |
以上是对序列的多层次索引,接下来将对数据框的多层次索引,多层索引的形式类似excel中的如下形式。
构造一个类似的高维数据框
df=pd.DataFrame(np.random.randint(10,50,20).reshape(5,4),index=[['A','A','A','B','B'],[1,2,3,1,2]],columns=[['x','x','x','y'],['x1','x2','x3','y']])
df
通过外层索引取出大块数据
df['x']
df.loc[['A'],:]
在数据框中使用多层索引,可以将整个数据集控制在二维表结构中,这对于数据重塑和基于分组的操作(如数据透视表的生成)比较有帮助。以test_data二维数据框为例,构造一个多层索引数据集。
pd.pivot_table(test_data,index=['marital','loan'])
以上pandas模块的基本学习就完成了。大家如果有问题欢迎大家可以在我们的机器学习专栏群里来讨论。还没有加入的同学可以扫描下方的微信二维码,添加微信好友,之后统一邀请你加入交流群。添加好友时一定要备注:机器学习。
1.脸熟的评判标准是根据通过留言的次数来决定的
2.留言时需要按照今日留言主题来用心留言,否则不计入总数
3.每日赠书专区会出现在AI派当天发布文章的头条或次条的文章末尾
本书简介:
本书不仅介绍大规模机器学习的基本概念,还包含丰富的案例研究。书中所选皆为*实用的技术和工具,而对理论细节不进行深入讨论,旨在提供大规模机器学习方法(甚至非常规方法)。不管是初学者、普通用户还是专家级用户,通过本书都能理解并掌握利用Python进行大规模机器学习。为让读者快速掌握核心技术,本书由浅入深讲解大量实例,图文并茂呈现每一步的操作结果,帮助读者更好地掌握大规模机器学习Python工具。
?↑↑点击上方小程序即可购买
恭喜上期通过留言成功混脸熟的读者:YuGuii,赠送一本《Python数据分析与数据化运营》
请中奖同学联系小编:wanglaoshi201907
/ 今日留言主题 /
你在Linux上做过最牛逼的操作是什么?rm -rf / ? ?
近期专栏推荐
1.
2.
3.
4.
点下「在看」,给文章盖个戳吧!?
小白也能看懂的Pandas实操演示教程(下)相关推荐
- 小白也能看懂的Pandas实操演示教程(上)
作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了解初学者学习过程的需求和问题,希望通过这个专栏能够广结好友,共同成长. 编辑:王老湿 今天主要带大家来实 ...
- 小白也可以看懂的Numpy实操演示教程
点击上方"AI派",选择"设为星标" 最新分享,第一时间送达! 作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了 ...
- c语言程序和plc程序的区别,一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂!...
原标题:一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂! 你真的了解PLC吗?你知道PLC与计算机的本质区别吗?我来简单解释一下吧. 1.PLC可以工作在极其恶劣的电磁环境中 如果我们把计算机 ...
- python进阶(小白也能看懂)——装饰器浅谈(一)
python进阶(小白也能看懂)--装饰器(一) 第四篇 文章目录 python进阶(小白也能看懂)--装饰器(一) 1.函数基础知识 例子1.1 例子1.2 例子1.3 例子1.4 2.不带参数的装 ...
- python进阶(小白也能看懂)——Map、Filter、Reduce
python进阶(小白也能看懂)--Map.Filter.Reduce 第三篇 Map.Filter.Reduce是python中常用的函数,使用这些函数能够给我们带来很多便捷. Map map(fu ...
- python进阶(小白也能看懂)——*args与**kwargs的使用
python进阶(小白也能看懂)--*args与**kwargs的使用 第一篇 理解*args与**kwargs在定义函数时的作用 假设你写了一个函数multiply(函数定义在下面),专门用来处理两 ...
- 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...
一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...
- 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)
小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...
- armbian清理_小孩子才做选择,OMV、HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南...
小孩子才做选择,OMV.HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南 2020-04-10 22:46:04 63点赞 609收藏 52评论 创作立场声明:今天我是一个可爱的 ...
最新文章
- SLAM++: SLAM at the Level of Objects
- 美专家:中国的机器人优势所引发的忧虑
- linux下多个db2,Linux下安装多个DB2副本
- 说说我的工作——桌面支持
- Apache Lucene 7.0即将发布!
- 用matlab解一维单势垒波函数,一维多势垒结构准束缚态的MATLAB分析计算
- Java并发编程实战~生产者-消费者模式
- golang中http协议实现
- Robot Framework(十二) javascript基础
- Executor Framework
- 使用OpenCV和NumPy处理图像数据时,出现显示异常,图片经常出现空白
- 心理正常与异常的区分_正常心理与异常心理的区分
- 创建第一个windows服务
- mysql 前10条 平均数_mysql – 每组最新N条记录的平均值
- Symbian手记【四】 —— Symbian的容器
- 银河帝国----基地前奏
- 使用python创建学员管理系统
- 更新DOTA2显示无法连接到更新服务器,DOTA2无法正常更新的解决方法 官方公告
- 小米Q1业绩:总营收769亿元,手机稳居全球前三
- 语音唤醒 mycroft-precise使用记录