文章目录
- 简单介绍
- Series数据结构
- DataFrame数据结构
- 索引对象
- 基本功能
- reindex重新索引
- drop丢弃指定轴上的项
- 索引、选取和过滤
- 用loc和iloc进行选取
- 算法运行数据对齐
- DataFrame和Series之间的运算
- 函数应用和映射
- 排名和排序
简单介绍
pandas
是python进行数据分析中非常重要的一个库,它主要有两种数据结构Series
和DataFrame
,先从了解pandas
中的两种数据结构及用法开始,后面再进行高级操作学习。
Series数据结构
Series
是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生最简单的Series:
可以理解为:Series
由索引index+值value组成
这里是没有指定索引,默认是会自动创建一个0到N-1(N为数据的长度)的整数型索引。
你可以通过Series 的values和index属性获取其数组表示形式和索引对象:
自己创建对应的索引(只需要指定index
属性即可,与值一一对应):
如何去取值?通过索引变量名[索引]
或者变量名[[索引列表]]
来取单个或者多个值:
可以看到取单个时返回的是一个标量,多个是Series数据类型。
还有一些类似numpy运算,对数据进行过滤:
将Series看成是一个定长的有序字典,是索引值到数据值的一个映射。它可以用在许多原本需要字典参数的函数中:
(1)判断某个索引是否存在:in
(2)还可以通过python字典来创建Series数据结构,键值key–索引index,value值–value值:
我不需要字典里面的全部数据,而且希望按一定顺序。只需要指定
index
属性,按照你想要的顺序和数据给定index
,程序会把你指定的索引与字典进行一一配对,没找到的赋予NaN
。
NaN
即Not a Number
可以通过isnull
或者notnull
方法来查看数据中是否存在NaN
值:
两个Series数据结构进行操作时,索引标签会自动对齐数据:
Series
对象本身及其索引都有一个name
属性,该属性跟pandas
其他的关键功能关系非常密切,可以先了解一下:
Series的索引可以通过赋值的方式就地修改:
DataFrame数据结构
- DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。
- DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
- DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。
可以直接传入一个由等长列表或NumPy数组组成的字典来创建DataFrame
:
行索引+列索引的二维数据
对于数据量较多的,可以调用head
方法只显示前5行:
传入字典创建DataFrame的列索引是随机的,可以在创建时指定columns
属性来创建需要的顺序列索引:
如果传入的列在数据中找不到,就会在结果中产生缺失值,同上也可以指定index
行索引:
DataFrame的每一列可以看成一个Series,name列名,索引行索引,可以通过DataFrame[列索引名]
来得到一个Series:
默认取得一列,取一行的数据可以通过loc
属性来取,后面将详细介绍这个属性:
其他一些增删改的操作:
可以直接对一列进行赋值:
(1)单个标量,会广播到这一列全部
(2)将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。
(3)如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值:
(4)为不存在的列赋值会创建出一个新列:
删除用del
关键字
嵌套字典传给DataFrame,pandas就会被解释为:外层字典的键作为列,内层键则作为行索引:
可以使用类似NumPy数组的方法,对DataFrame进行转置(交换行和列):
也可以指定index属性来改变顺序:
由Series组成的字典差不多也是一样的用法:
DataFrame构造函数所能接受的各种数据:
和Series一样,DataFrame也有name属性,行和列都有:
跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据:
索引对象
pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index:
Index对象是不可变的,因此用户不能对其进行修改:
index[1] = 'd' # TypeError
不可变可以使Index对象在多个数据结构之间安全共享:
每个索引都有一些方法和属性,它们可用于设置逻辑并回答有关该索引所包含的数据的常见问题。
基本功能
reindex重新索引
顾名思义,就是对索引进行重排或者其他操作。
- 重排序索引Series:(某个索引值当前不存在,就引入缺失值)
- 对于一些比较乱的整数索引需要填充补齐,指定方法中
method
,使用ffill可以实现前向值填充 :
- reindex可以修改索引,默认是行索引:(DataFrame)
修改列索引指定columns
即可:
- reindex函数的各参数及说明:
drop丢弃指定轴上的项
丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。
由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象:【也就是原对象并不会删除】
-
Series
指定inplace=True
,它会删除原有对象的数据
-
DataFrame
默认axis=0
就是删除行:
通过传递axis=1
或axis=’columns’
可以删除列的值:
索引、选取和过滤
- Series
Series索引(obj[...]
)的工作方式类似于NumPy数组的索引,只不过Series的索引值不只是整数。
利用标签的切片运算与普通的Python切片运算不同,其末端是包含的:
用切片可以对Series的相应部分进行设置:
- DataFrame
用一个值或序列对DataFrame进行索引其实就是获取一个或多个列:
首先通过切片或布尔型数组选取数据:(筛选的是行)
向[ ]传递单一的元素或列表,就可选择列。
通过布尔型DataFrame进行索引:(这个不分行和列)
用loc和iloc进行选取
对于DataFrame的行的标签索引,我引入了特殊的标签运算符loc和iloc。它们可以让你用类似NumPy的标记,使用轴标签(loc)或整数索引(iloc),从DataFrame选择行和列的子集。
行索引 loc:轴标签 iloc:整数索引
-
DataFrame实例.loc[行索引名, 列索引名]
-
DataFrame实例.iloc[行索引下标, 列索引下标]
这两个索引函数也适用于一个标签或多个标签的切片:
对于DataFrame,补充:
算法运行数据对齐
把两个DataFrame相加后将会返回一个新的DataFrame,其索引和列为原来那两个DataFrame的并集:没有共用的列或行标签,结果都会是空,共用的会执行相关操作,例如相加
如何对这些没有共用的进行填充,不显示NaN:
使用df1的add方法,传入df2以及一个fill_value参数,可以解决NaN的问题:
补充其他减法乘法除法运算:
加个r
是逆置的意思,A.sub(B)
正常时A-B
加个r
后是B-A
,其他类似。
DataFrame和Series之间的运算
numpy中二维-
一维的例子,这个类似:
DataFrame-Series:
默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播。
DataFrame的列索引与Series的索引 一一对应进行相关操作
如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集:
默认都是与DataFrame的列索引进行匹配,如果要改成行匹配需要进行下面操作:
传入axis='index'或axis=0
函数应用和映射
NumPy的ufuncs(元素级数组方法)也可用于操作pandas对象:
另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现此功能:
apply方法默认是在各行之间进行操作,保留列索引,指定axis=1
后就在各列中进行操作,保留行索引。
传递到apply的函数不是必须返回一个标量,还可以返回由多个值组成的Series:
元素级的Python函数也是可以用的。假如你想得到frame中各个浮点值的格式化字符串,使用map方法即可:
排名和排序
根据条件对数据集排序(sorting)也是一种重要的内置运算。要对行或列索引进行排序(按字典顺序),可使用sort_index方法,它将返回一个已排序的新对象:
索引排序:sort_index方法
- Series 索引排序
2. DataFrame索引排序
值排序:sort_values方法
- Series
在排序时,任何缺失值默认都会被放到Series的末尾:
- DataFrame
当排序一个DataFrame时,你可能希望根据一个或多个列中的值进行排序。将一个或多个列的名字传递给sort_values的by选项即可达到该目的:
排名会从1开始一直到数组中有效数据的数量。接下来介绍Series和DataFrame的rank方法。默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的:
- Series
也可以根据值在原数据中出现的顺序给出排名:
这里,条目0和2没有使用平均排名6.5,它们被设成了6和7,因为数据中标签0位于标签2的前面。
你也可以按降序进行排名:
- DataFrame