笔记来源:利用python进行数据分析【Wes Mckinnney著,唐学韬等译】
一、pandas的数据结构介绍【主要包括Series、DataFrame】
介绍:pandas名称为panel data(面板数据),其基于NumPy构建的
1、Series
(1)简单构建
Series是一种类似于一维数组的对象,有一组数据(可为NumPy数据类型)及一组与之相关的数据标签(索引)组成,若只有一组数据,则产生的是最简单的Series
(2)获取值及索引属性【.values .index】
由上述可知,Series的表现形式为,索引在左边,值在右边。因为上述没有为数据进行指定索引,其则会自动创建0-N-1(N为数据长度)的整数型索引,可使用values、index属性分别获取Series的表达形式和索引对象。
(3)传入自己定义的索引并取相应位置的值
创建含有自己定义的索引数据,创建内部传入第二个参数,该参数为index,其赋为一个列表形式,若取其中的一个值,一层列表传入键即可,如果取多个值,则两层列表传入多个键。
(4)Series 相关计算
(5)字典形式构建Series【键为索引,值为Series值】
(6)传入字典,默认字典的键作为索引,但也可重新定义索引。如下使用指定列表,传入的列表索引如果在原字典索引中有,则返回的值即为原索引对应的值,如果新索引在原索引中没有,则返回结果为NaN
【sdata中与states索引相匹配的那3个值会被找出了放到相应的位置上,但是由于‘California’所对应的sdata值找不到,返回结果为NaN,代表确实数据】
(7)检查是否为缺失数据( pd.isnull() pd.notnull() ), 返回与原来相同长度的布尔型结果
(8)算术运算,自动对齐不同索引数据
(9)Series对象的name属性与索引的name属性【也可对索引name】
(10)Series索引直接通过赋值进行修改
2、DataFrame
DataFrame是一个表格型的数据结构,含有有序的列,每列可是不同的值类型(如:数值、字符串、布尔值等)。其既有行索引、也有列索引。可以理解为有Series组成的字典(共同使用一个索引)
(1)创建方法
1)传入字典,字典内再传入列表【字典的键:DataFrame的列名、字典的值(列表元素):DataFrame的值】
常用的方法是直接传入一个由等长列表或NumPy数组组成的字典。并且行索引会自动加上(从0开始).可以对列索引按照指定顺序进行排序【columns关键字传入】
如果原来传入的数据已经有了列索引,我们再给其传入列索引,那么结果将和Series类似。即先在传入的数据中,有则返回原来数据对应的值,无则返回NaN值。如下【原列索引含有‘year’,‘state’,‘pop’,则这三个返回原来对应的值,但是‘debt’新增的列索引名在原来数据中没有,则返回值为NaN】
2)字典的嵌套(字典的字典)【最外层字典的键:DataFrame的列名、第二次字典的键:DataFrame的每行索引。第二层字典的值:DataFrame的值】
显示传入指定索引
其中新传入的索引没有对应值,则返回NaN
(2)获取指定位置的数据或对指定位置数据进行赋指定值
1)只获取指定列数据
直接通过DataFrame列表传入列名的形式或者.列名的方式获取。将得到一个Series数据(返回含有行索引)
2)三种获取指定位置数据的方式区别(.ix .loc .iloc)
loc【索引名称】:内部传入参数以列表形式传入(内容是索引名称,不能为索引号【除非索引名称即为索引号】
如果loc的索引名称即为索引号(为数字时),还可以进行切片操作【但这里的切片包含第一个与最后一个![含尾索引]】
iloc【索引号】:内部传入参数以列表形式传入(内容是索引号,不能为索引名称)不管行列均用索引号【切片不含尾索引】
ix【索引名称与索引号均可用】:是loc、iloc的结合体.可以混合使用索引名称与索引号
提示:ix使用提示其将被弃用。以后将使用以上两者(loc——通过行标签索引行数据
iloc——通过行号索引行数据。)进行替代
3) 对指定列进行赋值,可以为标量值,也可以为一组值【这组值必须与行数相匹配】
4)对指定列进行赋值,赋值为一个Series【如果精确匹配DataFrame的索引,则所有位置即被填充,否则为NaN】
5)对之前为出现的列进行赋值则会创建一个新的列,关键字del用于删除列【如下''eastern"之前未出现过,则会新创建】
(3)DataFrame的index和columns的name属性【index.name、columns.name、.values】
3、索引对象
pandas的索引对象负责管理轴标签和其他元数据(如轴名称等),构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换为一个Index
谨记:Index对象是不可修改的,从而保证了其在多个数据结构件安全共享
每个索引均有一些方法和属性。如下列出了Index的一些方法和属性
方法 | 说明 |
append | 连接另一个Index对象,产生一个新的Index |
diff | 计算差集,得到一个Index |
intersection | 计算交集 |
union | 计算并集 |
isin | 计算一个指示各值是否都包含在参数集合中的布尔值数组 |
delete | 删除索引i处的元素,并得到新的Index |
drop | 删除传入的值,并得到新的Index |
insert | 将元素插入到索引i处,并得到新的Index |
is_monotonic | 当元素均大于等于前一个元素时,即顺序递增或不变,返回True |
is_unique | 是否为唯一值,当Index没有重复值时,返回True |
unique | 计算Index中唯一值的数组 |
二、基本功能(p126)
1、重新索引【reindex()】
pandas对象的一个重要方法就是reindex.其主要用于创建一个适应新索引的新对象。
(1)单纯的重新索引【新索引代替原索引,如果原来无该索引,则新创建的索引默认对应值为NaN(表示缺失值)】
(2) 重新索引后,对新增的索引进行缺失值填充
1) 固定赋值填充
2)前向填充(新索引(新增)对应的值根据前一个索引(原存在)进行填充(与前一个索引相同的值),使用传入method=‘ffill’或‘pad’)
3)后向填充(意思让新索引(新增)对应的值根据后一个索引(原存在)进行填充(与后一个索引相同的值),使用传入method=‘bfill’或‘backfill’)
(3) DataFrame的重新索引(可修改行、列索引)
1)当仅传入一个序列时,重新索引行
2) 传入列重新索引列【原有则取原值,原无则为NaN值】
2、丢弃指定轴上的项(drop()方法)
(1)Series()相关
.drop()方法后有返回值,返回的即为丢弃后的内容,不改变drop()之前的内容
(2)DataFrame相关
其可删除任意轴上的索引值。【丢弃指定列,axis=1】
3、索引、选取、过滤
(1)Series索引相关【与NumPy数组索引类似,但Series索引不仅限整数】
1)取指定值
2) 使用标签进行切片【与python切片不同,这里标签切片含末端元素】
(2)DataFrame相关
1) 普通索引或索引标签取指定位置值【与上述Series类似】
2) 使用ix取指定位置的值
3)DataFrame的索引选项
类型 | 说明 |
obj[val] | 选DataFrame的单个列或一组列。如在布尔型数组(过滤行)、切片(行切片)、布尔型DataFrame时求解便利 |
obj.ix[val] | 选取DataFrame的单个行或一组行 |
obj.ix[:,val] | 选取单个列或列子集 |
obj.ix[val1,val2] | 同时选取行、列 |
reindex方法 | 将一个或多个轴匹配到新索引 |
xs方法 | 根据标签选取单行或单列,并返回一个Series |
icol、irow方法 | 根据整数位置选取单列或单行,并返回一个Series |
get_value、set_value方法 | 根据行标签和列标签选取单个值 |
4、算术运算和数据对齐
pandas最重要的功能,可对不同索引的对象进行算术运算。对象相加时,存在不同索引,则结果为索引对的并集。
(1)简单的算术计算
1)Series
2) DataFrame
(2) 在算术方法中填充值
1) add()
2)reindex()重新索引,指定填充值
(3)DataFrame和Series之间的运算
1) 简单NumPy数组广播计算示例
2)DataFrame与Series之间的广播计算也类似,如下示
3)两者进行相加计算,索引进行求并集,但是非共同索引值为NaN,共同索引值才有值
4) 两者进行相减时,按某个轴进行操作
5、函数应用和映射
NumPy的unfunc(元素级数组方法)也可以操作pandas对象
(1)np.abs()【求绝对值】
(2) .apply()的使用【将函数应用到各列或行形成一维数组】
(3)applymap() 的使用
而Series对应的应用元素级函数为map方法
6、排序和排名
(1)按索引排序【sort_index()函数,可传入轴向axis、顺序逆序值ascending】
(2) 按数值进行排序【python2用order方法、python3用sort_values方法】
1)Series按值排序
2) DataFrame按值排序
(3)排名rank方法【会增设一个排名值,从1开始,与numpy.argsort类似】
1).rank()有返回值,不影响原来的数据。返回的值是值的排名,如有多个值,求平均排名【默认method = ‘average’】。
2)当传入参数时method =‘first’时,不求平均排名【按原始数据中的出现顺序分配排名,出现越前,排名越靠前】
3) 降序排名,则传入参数ascending = False【即值最大排名序号越小,即最大值排名为1】
4) 排名时用于破坏平级关系的method选项
method | 说明 |
"average" | 默认:在相等的分组中,为各个值分配平均排名 |
"min" | 使用分组中的最小排名【可能有重复排名】 |
"max" | 使用整个分组中的最大排名【可能有重复排名】 |
"first" | 按值在原始数据中的出现顺序分配排名 |
7、带有重复值的索引
(1)索引是否为唯一值(is_unique())
(2)按索引取值
(3)DataFrame进行行索引取值
参考:
[1]. McKinney,W.著;唐学韬等译. 利用python进行数据分析[M]. 北京:机械工业出版社,2013.9.