第五章 pandas入门
5.1 pandas的数据结构介绍
pandas有两个主要的数据结构:Series和DataFrame
Series
Series由一组数据和与之相关的数据标签(索引)组成,仅有一组数据可以产生最简单的Series
索引在左边,数据在右边。如果没有指定索引,会自动生成0到N-1(N为数据长度)的整数索引,而且可以通过Series的属性index和values来分别获取索引和数据
指定索引创建Series:
可以通过索引来获取Series单一的值或者一组值,注意,想要获得一组值的话需要在方括号里传入索引列表:
使用numpy函数或者类似numpy运算,都会保留索引值:
也可以将Series看成一个定长的字典,许多字典里的函数也可以用在Series中:
通过字典也可以创建Series
如果只传入一个字典,那么字典的键会自动变成索引,传入排好序的键的列表,可以让索引重新排序:
如果传入的索引列表的长度与原数据不匹配,索引比数据短会自动把没有索引的数据给消除(但是此数据并没有被回收),索引比数剧长会给没有数据的那个索引赋值为NAN,pandas的isnull和notnull可以检测数据的缺失:
Series最重要的⼀个功能是,它会根据运算的索引标签自动对齐数据:
没有对应的索引的数组会被自动赋值给NAN
Series对象本身及其索引都有一个name属性:
Series的索引可以通过赋值的方式就地修改,修改之后索引的名称会消失
DataFrame
DataFrame是一个表格型数据结构,包含一组或几组有序的列,且每列都可以是不同的数据类型。有行索引和列索引。
常见的创建DataFrame的方法是传入一个含有等长列表或者等长数组的字典:
对于特别大的dataframe,head方法用于选取前五行:
如果指定了列序列,则dataframe会按照指定序列排序:
如果传入的列索引在数据中找不到,会自动生成缺失值,如果传入的行索引在数据中找不到,会报错:
通过字典或者属性的方式,可以将dataframe的列获取变成一个Series:
df[columns]可以获取任何列的名,而df.column只能获取列名符合python命名规则的列
列可以通过赋值的方式对数据进行修改,可以赋值为一个标量或一组值:
将列表或者数组进行赋值给dataframe时,要保证长度和df的长度一致,如果赋值的是一个Series,则会根据索引精确匹配进行赋值,而其他没有的空位全部由缺失值填补
注意,df.column不能用于创建列,而df.['column']可以用于创建新的列
关键字del用于删除列
通过索引方式返回的列对应的是原数据,而不是返回一个副本。而对返回的Series用copy方法可以返回副本。
如果嵌套字典传给DataFrame,pandas会将外层的键作为列索引,内层的键作为行索引:
可以使用类似numpy中转置的方法对行和列进行调换
可以输入给DataFrame构造器的数据:
如果给DataFrame的行和列也设置了name,这些信息也会显示出来:
如果df的各列数据类型不相同,则df会用一个可以包含所有数据类型的类型:dtype = object
values属性也会以二维ndarray的形式返回DataFrame中的数据:
索引对象
构建Series或者DataFrame时,任何数组或者其他序列的标签都会被转换成一个Index(对象),se或df的索引可以修改,但是index对象本身不可变,因此用户不能对其进行修改
Index的功能也类似于集合
与集合不同,index中的值可以重复,而且如果选择重复的标签,会显示出所有值:
5.2 基本功能
重新索引
pandas的reindex方法会重新根据索引对数据进行排列:
若索引列表中含有没有数据的索引,则会自动填上NaN,而且该函数返回一个新副本,并不是在原数据上进行修改。
reindex函数中含有许多参数,其中'method'参数可以设置如何自动填充缺失值(有时按照原文会报错,这里采用另一种方法,):
method选项是插值选项,即reindex中的参数一定要把原index全部包含,否则会出现全NaN情况
reindex可以对df进行行索引和列索引,如果值传递一个序列,会自动进行行索引
丢弃指定轴上的项
drop方法返回一个指定轴上丢弃了指定项后的新对象:
对于df,可以删除任意轴上的索引值,不过在删除列时只靠标签是不够的,要加上axis = 1:
如果想要就地修改,而不是返回一个新副本,则在函数里加上inplace = 'True'即可:
索引、选取和过滤
Series中,利用标签的切片运算与普通的Python切片运算不同,其末端是包含的:
用一个值或序列对df进行索引,获取的是一个或者多个列:
而向df采用切片索引或者布尔型索引,会选取行
布尔型索引时要指定一个列进行索引
用loc和iloc进行选取:
使用轴标签(loc)和整数标签(iloc),可以从df中选择行和列的子集
整数索引
对于整数型索引,如果上述索引方法会出错,如果非整数型索引,则可以,所以我们规定整数型索引通通利用标签进行索引。
算数运算与数据对齐
DataFrame对象相加,只要没有共用的列标签或者行标签,结果都为空,Series亦是如此
在算术方法中填充值
是如果对象相加没有共用的行标签或者列标签,但是又不想返回NaN,则可以用算术方法对空值进行填充。
上述add()方法中的fill_value = 0是将NaN值当作0来处理
下面是一些算术方法,这些算术方法返回的都是一个新副本,如果方法以r开头,说明会反转参数:
DataFrame与Series之间的运算
DataFrame和Series会先进行索引对齐,然后再进行广播运算
注意,iloc()函数返回的是一个series,而通过df切片返回的还是一个df,所以通过df切片返回的数据与df进行运算时df之间的运算
如果希望匹配在列上进行传播,则需要用到算术运算法,且需要传入轴参数
注意是在列上进行传播,但是传入的轴axis = 0(因为我们的目的是匹配行索引然后进行广播)
函数应用和映射
numpy的通用函数也可以用在pandas上
如果想要把自定义的函数或者函数用在每一行或者每一列上,可以用apply函数:
如果不传递轴参数,会沿着0轴使用函数,传递参数会沿着1轴使用函数
排序和排名
要对行或者列进行排序(按照字典顺序),可以使用sort_index方法,它返回的是一个新对象。而对于df,可以设定按行还是列进行排序
如果想要按照值进行排序,可以使用sort_values()方法进行排序,而对于df,如果想要按照某列进行排序,需要加入"by = '参照列'",注意此方法对于df来说只能按照列进行排序,如果by后面是行的话会报错
带有重复标签的轴索引
索引的is_unique属性可以说明索引中的值是否全是唯一的
如果索引对应多个值,则返回一个Series,如果索引对应的是一个值,则返回一个标量
5.3 汇总和计算描述统计
df的sum会自动返回一个列和的series,因为默认是先按照0轴进行运算,如果想要计算行和,需要传入轴参数axis = 1
一些统计方法:
唯一值、值计数以及成员资格
第一个函数是unique(),它可以将数据中重复的数据去掉,只留下一个,对于Series,其返回的是一个array,返回的新副本并不会自动排序
函数value_counts()返回的是每一个值出现的次数(频率)
函数isin()判断数组中的成员资格
对于df,也可以运用value_counts来计数,其中返回的索引是df中的唯一值,传递轴参数可计算相应轴上该值的出现次数。