目录
2.创建DataFrame对象----pd.DataFrame()
4.索引的排序与数据的排序----sort_index方法与sort_values方法
6.对于大数据集的部分查看----head方法与tail方法
1.检测和移除重复数据----duplicated方法和drop_duplicated方法
7.将一列数据转换为指标矩阵---pd.get_dummies函数
(3)使用DataFrame的某列作为索引---set_index方法
前言
该文章记录了我的pandas学习的所得,主要是二本书《利用python进行数据分析》,《python数据科学》,其中是一些pandas常用的操作
提示:以下是本篇文章正文内容,下面案例可供参考
一、pandas是什么?
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、pandas基础部分
首先了解pandas库中的三个基本数据结构:Series对象、DataFram对象、Index对象。
1.Series对象
1.初步认识Series对象
series对象就是带有索引数据(索引可以是数值或者字符)的一维数组对象(不再像ndarray只能存储一种数据类型),可以认为之前的ndarray是隐式索引,而series对象是显式索引,先来看一个简单的Series对象:
左侧的字母是右侧数值对应的索引。
2.创建Series对象----pd.Series()
(1)通过直接传入数组来创建Series对象
如图可见,这样会给创建的Series对象配置默认的常规索引
(2)通过传入数组和index参数自行设置索引来创建Series对象
如图可见,这样创建的Series对象会以传入的index参数列表作为自己对应的索引
(3)通过传入字典来创建Series对象
当传入字典来创建Series对象时,同样可以传入index参数,此时index参数起筛选作用,示例如下:
3.Series对象的三个重要属性
Series对象有三个常用重要属性:name, index, values
name:该Series对象的数据列名
index:该Series对象的索引,返回一个Index对象(改对象的详细介绍请看后文)
values:该Series对象的数据,返回一个特殊的ndarray数组(这里我说特殊是因为它可以包含不同数据类型的数据)
4.Series对象的数据取值与修改
对Series对象的数据取值有二种方法,一种是根据显/隐索引取值,另外一种就是运用索引器loc/iloc去取值。
(1)显/隐索引取值
以该Series对象作为示例:
对于显式索引则是运用Series的显式索引,可以直接将numpy库中ndarray对象的下标索引,切片索引,掩码索引,花哨索引运用进来(显式索引的切片操作是包括末端的)这里展示部分示例:
(2)索引器索引
以该Series对象作为示例:
如上图Series对象所示,出现这种显式索引与隐式索引式,最好使用索引器索引:loc/iloc,当使用loc时则为使用显式索引,使用iloc时则为使用隐式索引,自然可以对应使用下标索引,切片索引,掩码索引,花哨索引。下面是一个关于二个索引器使用的例子:
如果要对对象中的数据进行修改则取出然后修改即可(索引取值中除了花哨索引,其他返回的均为原数据的副本视图),数据修改示例如下:
5.Series字段的修改和索引的修改
(1)Series字段的修改
对字段的修改实质上就是对Series对象name属性的修改,示例如下:
(2)对索引值的修改
对Series对象索引值的修改是直接对index属性进行修改:
2.DataFrame对象
1.初步认识DataFrame对象
DataFrame对象是一个表格型数据结构,它包含一组有序的列,每列可以是不同的值类型。DataFrame既有行索引也有列索引,它可以被看作由Series组成的字典(共用一个索引),下面来看一个简单的DataFrame对象:
2.创建DataFrame对象----pd.DataFrame()
(1)通过传入二维数组来创建DataFrame对象
当只传入二维数组时,则默认会为DataFrame配置常规行列索引,也可以自行通过index、columns参数来设置行、列索引
(2)通过传入以Series作为值的字典来创建DataFrame对象
3.DataFrame对象的三个重要属性
DataFrame对象的三个常见重要属性:index, columns,values
index、columns:DataFrame对象的行、列索引,返回的都是Index对象
values:DataFrame对象的数据,返回的是一个特殊的ndarray对象
4.DataFrame对象的数据取值与修改
DataFrame对象也是有二种获取数据的方法,一种是不借助索引器的索引,另一种是借助索引器的索引。这里以下列表格数据作为例子:
(1)不借助索引器,DataFrame对象支持列名索引,行切片索引,掩码索引
列名索引(一次可以传入多个列名):当使用列名索引时,基本操作对象是列
行切片索引:当对DataFrame使用切片时,基本操作对象是行
掩码索引
常用的还有通过掩码索引实现行过滤:
(2)通过借助索引器loc、iloc便可以将DataFrame看作二维的ndarray对象,实现更加灵活的索引:下标索引,切片索引,掩码索引,花哨索引,以下有几个示例:
在借助索引器以后,你就无法在索引器下面进行不借助索引器的列名索引:
注意:除了花哨索引,其他索引返回的均是原表的副本视图,且索引单行单列返回的均为一个横向储存的Series对像,其name属性是其在表格中的列字段或行字段
故如果要对表中的数据进行修改,则直接选取,然后再进行重新赋值即可。
5.DataFrame对象索引的修改与索引标签的设置
(1)索引的修改,直接对对象的index属性和columns属性进行重新设置
(2)索引标签的设置,所谓索引标签其实就是给索引设置一个名字,便于读表者理解:
3.Index对象
Index对象通常通过pd.index()传入一个一维数组来创建,先来看一个简单的Index对象:
Index对象可以看作一个不可变数组或可以有重复元素有序集合
Index对象基本与ndarray对象相同,只是它的元素不可改变:
另外Index对象也类似与python自带的基本的数据结构集合,但是它可以拥有重复的元素:
但是Index对象可以遵从集合的规则,进行集合的交、并,
虽然进行相关操作现在乃可以使用&和|来进行,但是写作本博客时,pandas库官方已提示未来可能使用intersection()方法和union()方法来替代,故这里我用它们来演示:
4.Series、DataFrame中对数据操作的基本功能
1.二种数据结构 各自 及 其之间的运算
Pandas中的运算和numpy中数组运算的最大不同就是:pandas中的运算遵循索引对齐运算
(1)Series之间的运算,遵循索引对齐,无法对齐的地方则会以缺失值来进行填充:
如果想要避免缺失值的产生,可以使用相关运算对应的方法来进行运算(相关方法和numpy库中的相同),然后传入fill_value参数,在找不到对齐数据时,会用fill_value来代替对齐值参与运算:
(2)DataFrame之间的运算
DataFrame的运算中,对齐操作会同时作用在行索引和列索引上面,找不到对齐值同样会产生缺失值,也可以像Series一样使用运算相对应的方法,然后传入fill_value参数:
(3)DataFrame与Series对象之间的运算
DataFrame与Series对象之间的运算遵循广播规则,第一次接触广播规则的同学可以看一下我的另外一篇博客广播规则的个人理解,下面我来举出一个在我刚刚开始学习pandas让我头疼了一段时间的例子,以下面数据表为原数据:
当我们像让数据表减去某一行时,称为行运算,这也是所有运算方法的默认方式(即默认axis = 1),示例如下:
其内部广播实现如下:
我们像让数据表减去某一列时,称为列运算,要设置axis = 0,示例如下:
其广播操作如下:
2.重排行、列索引----reindex()方法
注意:reindex()返回的为一个新的DataFrame对象,不是副本视图
3.删除指定行或者列----drop()方法
(1)用于Series对象
(2)用于DataFrame对象(还是以上面的data数据集为示例)
删除指定行:
删除指定列:
注意:drop()方法为返回一个新的数据对象,如果想要直接在原数据集上进行原地修改,需要传入参数inplace = True
3.函数的运用与映射
(1)numpy库的各种元素级函数、方法(既作用在每一个元素上的函数、方法,如np.abs等)
(2)自定义元素级函数,运用于每一个数据----map方法与applymap方法
(3)numpy的各种聚合函数可以作用在pandas对象上
(4)自创建用于DataFrame对象对统计聚合函数---apply方法
此时apply中传入的函数的变量,根据axis为0或1,对应着行Series或列Series
注意:pandas中的各种汇总、统计、聚合函数会自动忽略缺失值
4.索引的排序与数据的排序----sort_index方法与sort_values方法
(1)对索引的排序
对索引的排序是按照字典中的顺序来的:
Series对象同理
(2)对数据按值排序
传入一个列时,根据该列来进行排序:
当传入多个列时,先按第一个列排序,再根据后面传入的列,对数值相等的部分进行排序
Series对象同理
5.重复的检测----is_unique
is_unique用于检测对应的一维对象是否有重复值:
6.对于大数据集的部分查看----head方法与tail方法
7.常用的Series方法
下面用该Series数据对象来说明:
(1)isin方法:
(2)unique方法:
(3)value_count方法:
三、数据导入
对csv文件:pd.read_csv(‘对应文件的绝对路径’)
对excel文件:pd.read_excel('对应文件的绝对路径')
数据读取函数的具体参数过多,可以根据需求参考python的pandas库官方文档
四、数据清洗
1.对缺失值的处理
pandas中缺失值的常用处理方法如下:
1.滤除缺失数据----dropna方法
(1)对Series对象,dropna使用起来十分简单:
(2)对DataFrame对象:
可以传入二个参数,一个是how,它可以取all或any,all表示全部是缺失值才删去,any表示只要存在缺失值就删,axis则决定进行操作的轴:
2.填充缺失数据----fillna方法
(1)对Series对象:
(2)对DataFrame对象:
可传入的相关参数如下:
示例如下:
2.数据转换、映射
1.检测和移除重复数据----duplicated方法和drop_duplicated方法
重复值的检测和去除均是以DataFrame的列为基本单位
(1)duplicated方法:
会对传入的列进行行单位的检测(默认是全部行),然后返回一个布尔型Series,表示各行是否在之前出现过:
(2)drop_duplicated方法:
基于duplicated方法,对重复行进行删除,默认对后出现的行进行删除,也可以用keep参数传入last保留后出现的一行
2.数据的映射---map方法
map一般用于series对象的映射(其实还可以用于index,实现索引轴的映射修改),map作为一个元素级方法,它可以接受一个函数或含有映射关系的字典型对象,上文已经讨论过传入函数的情形,数据映射时(特别是对于字符型数据)经常通过传入字典对象来实现,示例如下:
3.数据替换---replace方法
replace可作用在Series对象与DataFrame对象,将对应的值替换为某值,具体参数传入形式看下面示例:
4.重命名轴索引---rename方法/map方法
我们在基础部分学过通过对pandas对象的index属性重新赋值来修改轴索引,但是当数据过大时,这种方法的效率可能就不高了。下面来认识二种面对大数据集时效率更高的修改方法:
(1)map方法
map方法也可以用于index对象,参数同样时传入一个函数或者带有映射关系的字典
(2)rename方法
5.离散化和面元划分---pd.cut函数
为了便于分析,连续数据常常被离散化或拆分为面元。具体实例如下:
pd.cut函数对传入的数据,根据bins参数的各点作为分断点对数据进行分面,最终返回一个Categorical对象,展示了pandas.cut划分的面元, Categorical对象常用的有二个属性和一个函数,二个属性是codes、categories,codes属性为各个数据属于那个分面(显示对应分面的索引),categories则反映分面类型,一个函数则是pd.value_counts,它是pandas.cut结果的面元计数器(注意区分用于Series计数的方法value_counts方法),具体实例如下:
另外cut函数还可以传入labels参数,为每一个面元设置名称,示例如下:
当数据类型是数值时,可以直接传入数据和面元数量,函数会根据数据的最大值和最小值计算等长面元来进行划分,各个区间的闭的位置可以通过传入right=Fales(左闭右开)/left=Fales (默认,左开右闭),示例如下:
另外pd.cut函数还有一个衍生函数:pd.qcut,它会在保证每一个划分区间包含相同数量数据的前提下去划分面元,示例如下:
6.检测和过滤异常值
对异常值的检测
对异常值对设置通常会应用到np.sign函数,它会根据数据的正负返回1、-1,具体实例如下:
7.将一列数据转换为指标矩阵---pd.get_dummies函数
示例如下:
3.向量化字符串操作
pandas为包含字符串的Series和Index对象提供的str属性,它既可以满足向量化字符串操作的需求,有可以自动跳过对缺失值的处理。
它包含了python自带字符串处理方法,但是将其向量化,且速度更快:
但是要想充分灵活地操作字符串,我想应该离不开正则表达式的学习,他就是python的re库,这个我自己后面也会去学习然后单独写一篇博客,大家也可以去了解一下。
五、数据规整
1.多级索引
多级索引可以让我们在二维的水平上去处理更多维的数据
(1)多级索引的创建方法
创建包含多级索引的Series、DataFrame对象最快的方法就是将index参数设置为至少二维的索引数组:
也可以先创建一个MultiIndex对象,然后将其传给index对象即可,创建MultiIndex对象的常用方法如下:
一般我们还会对多层索引的各级索引设置对应的索引名,可通过改变index对象的names属性来进行设置:
(2)层级索引的重排与分级排序
对层级索引的重排可以使用swaplevel方法,传入要交换次序的索引的索引名即可:
对索引的排序使用对是sort_index方法,通过axis传入操作的轴,leval传入操作索引的层级:
(3)使用DataFrame的某列作为索引---set_index方法
传入对应的列名,将将该列作为索引:
其逆操作便是reset_index方法:
(4)多层索引的数据获取
对于多层索引的Series对象:
当然也还支持索引器索引,掩码索引,花哨索引等等,在此不做演示,但是在使用切片时,应确保多层索引是按字典顺序排序的,否则应先对MultiIndex使用sort_index()方法
对于DataFrame对象:
DataFrame的基本索引是列索引,因此Series中多级索引的用法到了DataFrame中就应用到列上面了,当然也可以使用索引器将数据看作二维数组来处理。
2.数据集的合并 ---pd.concat函数
pd.concat常用参数如下:
3.数据集的连接---pd.merge函数
pd.merge常用参数如下:
on:指定二表中的某个重复列作为关系列进行连接
left_on、right_on:指定左表和右表的某列,作为关系列进行连接
left_index、right_index:常用于Series对象之间的连接或者Series与DataFrame之间的连接,用于以一个索引作为关系列进行连接,在进行Series与DataFrame之间的连接时,可以配合left_on、right_on使用
suffixes:用于给连接后的重复列名添加后缀
how:可设置为inner、left、right、outer (其实就是类似sql里面的左、右连接和外连接)
示例如下:
4.数据透视表---pd.pivot函数
参数如下:
index:选择哪一列作为行索引
columns:选择哪一列作为列索引
values:要展示的数据值