文章来源:拉钩数据分析训练营
Python在数据处理和准备⽅⾯⼀直做得很好,但在数据分析和建模⽅⾯就差⼀些。Pandas帮助填补了这⼀空⽩,使您能够在Python中执⾏整个数据分析⼯作流程,⽽不必切换到更特定于领域的语⾔,如R(R一般应用于生物领域)。与出⾊的 jupyter⼯具包和其他库相结合,Python中⽤于进⾏数据分析的环境在性能、⽣产率和协作能⼒⽅⾯都是卓越的。Pandas是 Python 的核⼼数据分析⽀持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas是Python进⾏数据分析的必备⾼级⼯具。Pandas的主要数据结构是 Series(⼀维数据)与 DataFrame (⼆维数据),这两种数据结构⾜以处理⾦融、统计、社会科学、⼯程等领域⾥的⼤多数案例。处理数据⼀般分为⼏个阶段:数据整理与清洗、数据分析与建模、数据可视化与制表,Pandas 是处理数据的理想⼯具。Pandas库安装:pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
Pandas是基于NumPy的升级,想要使用Pandas就必须要安装NumPy,调用时同理
pandas的数据结构常用的主要有两种:
Series(⼀维数据)与 DataFrame (⼆维数据)
当然Pandas也支持三位数据和四维数据,但是不常用,主要了解一位数据和二维数据。
pd.series(data,index,dtype,name,copy)
Series是一维的数组,和NumPy数组不一样:Series多了索引
主要有以下几个参数
data:数据
index:定义行索引,参数接收值为str,如果未指定,将会生成由0开始的整形正序数值,0,1,2,3,4,5,6……,如指定,将会生成我们指定的索引,如ABCDEF…,如果指定索引的话,一定要记得和我们数据的个数要相等。
dtype:定义数据类型,参数接收值为str('int','float16','float32'…..),未指定的话会根据我们输入的数据自动识别。
name:定义系列名称(列名),参数接收值为str。
copy:复制输入数据,参数接收值为bool,默认为False。
其中我们经常设置的参数为data,index,以及dtype,
series常用创建方式有三种:
1)只输入data参数不设置索引:
0array([1, 2, 3, 6, 9])
0 1
1 2
2 3
3 6
4 9
dtype: int32
2)按列表指定索引:
A 1.0
B 2.0
C 3.0
D 6.0
E 9.0
Name: a, dtype: float64
3)按字典键名指定索引
语文 149
数学 130
英语 118
文综 285
Python 122
dtype: int64
Series是一维的,功能比较少,DataFrame是二维的,多个Series公用索引(列名),组成了DataFrame,像 Excel一样的结构化关系型数据。
DataFrame的两种创建方式
1)列表定义列索引:
2)按字典键名指定列索引
常用的数据查看方法:
# 查看其属性、概览和统计信息
df.head(10) # 显示头部10⾏,默认5个
df.tail(10) # 显示末尾10⾏,默认5个
df.shape # 查看形状,⾏数和列数
df.dtypes # 查看数据类型
df.index # ⾏索引
df.columns # 列索引wps office 官方的下载的地方在哪
df.values # 对象值,⼆维ndarray数组
df.describe() # 查看数值型列的汇总统计,计数、平均值、标准差、最⼩值、四分位数、最⼤值
http://
df.info()
# 查看列索引、数据类型、⾮空计数和内存信息
(100, 3)
Python int32
Math int32
En int32
dtype: object
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99 #共有三行,行索引从0到99
Data columns (total 3 columns): #共有三列
# Column Non-Null Count Dtype
— —— ————– —–
0 Python 100 non-null int32 #Python列有100个非空值,数据类型为int32
1 Math 100 non-null int32 #Math列有100个非空值,数据类型为int32
2 En 100 non-null int32 #En列有100个非空值,数据类型为int32
dtypes: int32(3)
memory usage: 1.3 KB #占用内存1.3KB
array([[ 29, 7, 58],
[144, 0, 34],
[103, 113, 83],
.
.
.
[118, 29, 64],
[ 41, 46, 6],
[135, 17, 35]])
Index(['Python', 'Math', 'En'], dtype='object')
RangeIndex(start=0, stop=100, step=1) #起始索引为0,终止所以为100,步长为1
Panda常用数据输入和输出有四种类型,csv文件、Excel文件、HDF5以及SQL读写,下面分别介绍:
4.1.1.csv文件写入
4.1.2.csv文件加载
注意:
1.index_col参数 –设置行索引
如果我们的文件没有行索引这一列的话,这个参数尽量不要设置,否则会把数据的第一列作为行索引;而如果我们的文件有行索引这一列的话(一般在第一列),尽量设置这个参数为0,否则会把行索引作为数据的第一列,自动添加一列为行索引;这个也可以赋值其他的索引(如12345..,比如这里赋值2的话,math这一列的值就会成为行索引),赋值哪个列索引,这一列的值就会变成行索引.
2.header参数 –设置列索引
如果我们的文件没有列索引这一列的话,一定要设置这个参数为None,否则会把数据的第一行作为列索引。如果我们的文件有行索引这一列的话(一般在第一列),尽量设置这个参数或者设置为'infer',否则会生成一个从0开始的递增数列作为列索引
读写Excel之前,需要先安装两个库
读取Excel文件:pip install xlrd -i
https://
pypi.tuna.tsinghua.edu.cn
/simple
写入Excel文件:pip install xlwt -i
https://
pypi.tuna.tsinghua.edu.cn
/simple
4.2.1.写入Excel
以上即为常用的几个写入Excel方法to_excel的参数,我们一般写入文件的时候就写一个文件名就可以,不用设置这么多的参数。
上边的代码执行完毕写入的数据是这样的:
4.2.2.读取Excel
上边的代码执行完毕读取的数据是这样的:
读写HDF5之前,需要先安装包:
pip install tables -i
https://
pypi.tuna.tsinghua.edu.cn
/simple
HDF5是⼀个独特的技术套件,可以管理⾮常⼤和复杂的数据收集。
HDF5,可以存储不同类型数据的⽂件格式,后缀通常是.h5,它的结构是层次性的。
⼀个HDF5⽂件可以被看作是⼀个组包含了各类不同的数据集。
对于HDF5⽂件中的数据存储,有两个核⼼概念:group 和 dataset
dataset 代表数据集,⼀个⽂件当中可以存放不同种类的数据集,这些数据集如何管理,就⽤到了group
最直观的理解,可以参考我们的⽂件管理系统,不同的⽂件位于不同的⽬录下。
⽬录就是HDF5中的group, 描述了数据集dataset的分类信息,通过group 有效的将多种dataset 进⾏管
理和区分;⽂件就是HDF5中的dataset, 表示的是具体的数据。
4.3.1.写入HDF5文件
4.3.2.读取HDF5文件
读取结果为:
写SQL之前,需要安装两个库
pip install sqlalchemy -i
https://
pypi.tuna.tsinghua.edu.cn
/simple
pip install pymysql -i
https://
pypi.tuna.tsinghua.edu.cn
/simp
其中SQLAlchemy是Python编程语⾔下的⼀款开源软件。提供了SQL⼯具包及对象关系映射(ORM)⼯具,可以理解为数据库引擎,
pymysql则是python中类似于mysql的一个包wps官网的下载网址在哪里(wps下载电脑版免费吗)。
数据库的配置,可以查看:https://docs.sqlalchemy.org/en/13/core/engines.html
其中mysql数据库的常见连接方式有三种,常用最后一种连接方式:
读写SQL之前的操作:
4.4.1.将数据写入MySQL数据库
4.4.2.读取MySQL数据库中的数据
读取的数据为:
5.1.1.获取单列数据
5.1.2.获取多列数据
标签选取,就是按照索引标签选取,调用方法为.loc,即location。
Python 0
Math 29
En 113
Name: A, dtype: int32
0
A 0
C 137
F 3
Name: Python, dtype: int32
可见,按标签选取数据和之前学的numpy以及python的索引和切片方式是一样的,只不过要注意什么时候用双中括号,什么时候用单中括号,且按照标签选取是左闭右闭的,选取的数据包括结束的那个标签。
位置选取类似于标签选取,但是用的是标签所对应的实际索引,行列索引都是从0开始,这时候的选取是左闭右开的,不包括切片结尾的索引数据
数据准备:
布尔索引,简单来说是我们先设置一个条件,这个条件输出的是布尔值True和False,然后我们用类似于numpy的花式索引的方式选取的方式调用条件,来达到按条件选取数据的目的,具体操作如下:
准备数据
输出值为:
A True
B False
C False
D False
E False
F True
G False
H True
I True
J False
Name: Python, dtype: bool
接下来我们调用这个条件
由结果可见,用布尔索引的方式,达到了按条件选取数据的目的,当然,也可以用与条件和或条件等复杂逻辑运算来做更进一步的筛选:
也可以使用聚合函数来进行条件选取:
那么如果想选取与条件相反的数据呢,就在条件前面加上~即可
如果想选取在我们所列出的数组中的数据,可以用isin函数:
isin 同样也可以使用~来选取不存在数组中的函数,用法同上。
数据准备
6.1.1.行合并,竖直方向增加
行合并还可以用append的方式
6.1.2.列合并,水平方向增加
insert只能插入列,不能插入行,插入行用append
merge合并的效果类似于SQL中的表连接,具体使用方法如下:
准备数据:
上边用concat的列合并,是直接在水平方向上叠加,并不考虑连接的值是否相等的问题,比如
得出来的数据是将两个Dataframe横向叠加了
这时候如果想要实现像MySQL的表连接一样的效果,就需要用到merge方法:
准备数据:
drop_duplicates的参数:一个不写全按照默认值处理 1.
subset: 列标签或标签序列,可选仅考虑某些列来标识重复项,默认使用所有列 2.
keep:确定要保留的重复项(如果有),默认为first
‘first’:保留第一次出现的重复项,其余全删除。’last‘:保留最后一次出现的重复项,其余全删除。False:删除所有重复项,一个也不留。
注意first和last是str,要加引号,False不用加。
3.inplace: 是否改变原变量数据,默认为False,如果设置为Ture将会改变原变量,慎用。 4.ignore_index: 是否为结果重新编排新的行索引,默认为False,设置为True的话,返回的结果行索引为从0开始重新递增的新行索引,比如默认返回的数据行索引是0,3,5,6,8,10,设置为True的话返回的结果的行索引就会变成0,1,2,3,4,5。
构造数据:
dropna参数解析: 1)
axis=0, 确定要删除的是包含空值的行还是列,默认是0即行,1为列 2)
how='any', 确认要删除这一行或这一列需要满足的条件,默认为any,只要有一个空值就删除,all要这一行或这一列都为空值才删除 thresh=None, 此行或者此列非空值的个数要大于等于int的情况下才保留这一行或这一列,默认为None,比如上表
当thresh=None或者不写时,默认只要有空值就删除这一行,那么最后剩下行索引为7的这一行当thresh=0时,保留所有行,因为所有行的非空值个数都大于等于0个当thresh=1时,去掉第1行,因为其他行的非空值个数都大于等于1个当thresh=2时,去掉前2行,因为其他行的非空值个数都大于等于2个当thresh=3时,去掉前3行,因为其他行的非空值个数都大于等于3个当thresh=4时,去掉前4行,因为其他行的非空值个数都大于等于4个当thresh=5时,去掉前5行,因为只有最后三行的非空值个数都大于等于5个当thresh=6时,去掉前6行,因为只有最后两行的非空值个数都大于等于6个当thresh=7时,去掉前7行,因为只有最后一行的非空值个数都大于等于7个当thresh=8或以上时,去掉所有行,因为只有七列,不可能存在有8个非空值的行
3)subset=None, 只删除指定列中含有缺失值的行,sunset 的值要为数组或者none
dfa.dropna(subset=np.array([3])) #这里就是只删除了列索引3中含有空值的行
4)inplace=False,是否改变原变量数据,默认为False,如果设置为Ture将会改变原变量,慎用。
数据准备:
drop参数解析:
1)
labels=None,确定要删除的项目,可以是行列索引(0,1,2,3..)也可也是行列的标签,删除单个的时候可以是str/int或者list,删除多个的时候必须是一个列表['big','small','mid']…。 2)
axis=0,确定要删除的是列还是行,0为行,1为列,默认0. 3)
index=None,相当于axis=0,默认为None 4)
columns=None,相当于axis=1,默认为None 5)
level=None,当索引为多重索引的时候,删除指定级别的对应索引行数据,默认为None。
比如此例中,行为2重索引,那么我们在删除行索引标签为length的行时候,要制定level=1,因为length的索引级别在第二级别,否则会报错;而当索引不是多重索引不要设置level的值或者设置None,否则也会报错。 6)
inplace=False,是否改变原变量数据,默认为False,如果设置为Ture将会改变原变量,慎用。
数据准备:
filter参数解析:
items:精确匹配,保留标签/索引为列表中所列的值的行或者列,items的值为列表,默认为None。
like:模糊匹配,保留了标签/索引含有所列字符串内字符的行或者列,like的值为str,默认为None。
regex:正则匹配,默认为None。
axis:确定要进行筛选的是行还是列,0为行,1为列,注意这里和之前不同的是,
filter的axis参数默认值是1。
数据准备:
数据准备:
rename参数解析
mapper=None,定义要修改的值,mapper值为字典,冒号前为要修改的值,冒号后为要改为的值,与axis配合使用,默认为None。
axis=None,定义要修改行还是列,与mapper配合使用,默认为None。
index=None,定义要修改的值,修改行索引,mapper值为字典,冒号前为要修改的值,冒号后为要改为的值,默认为None。
columns=None,定义要修改的值,修改列索引,mapper值为字典,冒号前为要修改的值,冒号后为要改为的值,默认为None。
一般常用的是index和columns,mapper和axis不常用。
inplace=False,是否改变原变量数据,默认为False,如果设置为Ture将会改变原变量,慎用。
level=None,当索引为多重索引的时候,修改指定级别的对应的索引标签,默认为None。
8.2.1.replace
replace参数解析(常用):
to_replace=None,要修改的值,值类型可以是int,float,列表,字段等
value=None,要改为的值,值类型可以是int,float,列表,字段等
注意多对多修改to_replace和value值的个数要相等。
inplace=False,是否改变原变量数据,默认为False,如果设置为Ture将会改变原变量,慎用。
8.2.2.map映射元素转变
map WPS office的官网下载地址在哪里 只能针对一列,就是Series,map是起到映射的作用,即把df的值传递给它里边的参数,map既可以是序列,也可以是函数
X NaN
B NaN
C 3.140
D 3.140
E 2.718
F NaN
H 1108.000
I 3.140
J NaN
Y 2.718
Name: 人工智能, dtype: float64
X True
B True
C True
D True
E True
F True
H True
I True
J True
Y True
Name: Keras, dtype: bool
8.2.3.apply、applymap、transform映射元素转变
apply既可以操作Series又可以操作DataFrame
apply是起到映射的作用,即把df的值传递给它里边的参数,apply既可以是序列,也可以是函数
当apply操作的是一列的时候,用法和效果是和map一样的,是一个Series
当apply操作的是多列的时候,返回的结果是个DataFrame
针对单列和多列的计算,applay和transform的用法和效果是一样的,但是transform不能对整体进行操作,也就是说使用transform时必须要指定对哪一列或者那几列进行什么样的操作,关于applay和transform的具体异同点,可查看下方链接
applay和transform的异同点:
https://www.
jb51.net/article/149789
.htm
而applymap是对DataFrame中的所有元素进行操作,不能聚合,只能逐个操作,关于apply和applymap的具体区别可查看以下链接
pandas中的map()、apply()、applymap()函数的区别:
https://www.
cnblogs.com/jason–/p/1
1427145.html
wps电脑版下载的网站在哪(wps官网最新登录入口)
8.2.4.打乱随机抽样和哑变量
1)打乱随机抽样
有时候需要从大量数据中随机抽样,但是按顺序选难免没有参考性,这时候就可以使用permutation和take的组合进行重排打乱选取样本数据:
2)哑变量
前面在numpy说到过行列转置,行列转置是直接将行列的位置调换,但是时对行列的整体进行转置,在遇到多层索引的时候,不能对某一层索引进行单独的行列转置,这时候就用到了pandas的行列转置操作。
由图可见,行索引是分两级的,这时候如果想对行索引进行单级别的行列转换,就需要用到unstack函数:
wps的官网下载地址是什么
有行转列就有列转行,列转行要用到的函数是stack
数据大概就是上图这样。
行列转换还可以套着用:
这样就把原来的二级行索引变成了列索引,列索引变成了二级行索引。
行列转换还可以配合聚合函数使用,直接计算某一级索引的聚合值: