1.5 Pandas的数据框(DataFrame)对象的使用方法
在Altair中,使用的数据集要以“整洁的格式”加载。这就需要将原始数据整理成适当的数据结构,才可以使用Altair的API、实例方法和类进行各种场景的分类汇总及统计分组。其中,分类汇总就是统计学中的描述统计,例如,均值、标准差、最大值、最小值、中位数、分位数、计数(count)和求和(sum)等。因此,整洁的数据格式是Altair需要的数据结构,同时,整洁的数据格式也是实现统计可视化的必要环节。Pandas中的DataFrame是Altair使用数据集的数据结构之一。
DataFrame是一种类似Excel或SPSS的表格型数据结构,DataFrame既有行索引,也有列索引,每一行是一个观察记录(case/observation),每一列是一个变量的不同取值(variable values)。创建DataFrame主要使用Python中的字典。下面,我们通过示例说明具体的实现方法。
1.5.1 使用字典创建DataFrame的方法
(1)导入Pandas。
(2)定义一个变量,用来存储字典。
(3)生成Pandas中的DataFrame。
如果需要查看某些变量的取值情况,则可以给DataFrame增加列索引;如果需要查看某些案例(cases),也称为观测记录(observations),即样本(samples),还可以增加行索引。
注意:输出结果中的第1列不是索引数(即下标),而是关键字参数index列表中的元素。由于下标和目前列表中的元素(0和1)相同,可能会误以为它们是一样的。如果查看第3行的观测记录,则可以使用df.loc["two"],但不可以使用df.loc[2]。
如果列索引的字符串不是字典中的键,那么生成的DataFrame中的相应变量的取值就是空值(NaN),例如,使用字符串"name"作为列表columns中的元素。
1.5.2 DataFrame的操作方法
对DataFrame而言,可以选择某一列或若干列、某一行或若干行、某一个值或若干个值,也可以查看行索引、列索引、值区域。
下面使用以下代码生成DataFrame,存储在变量df里。
查看行索引。
查看列索引。
查看值区域,也就是不包含行索引和列索引,这是一个二维数组,行和列的索引起始值都是0。
查看某一列和若干列。
注意:选择若干列需要将列索引中的元素放在列表中,从而产生双列表。
查看某一行和若干行。
注意:选择若干行需要将行索引中的元素放在列表里,从而产生双列表。
查看某一个值和若干个值。
1.5.3 缺失值的操作方法
对于DataFrame而言,缺失值的识别和处理可以使用Pandas。缺失值的识别和处理是数据清理的重要环节。因此,高效、简便地识别方法和处理流程就显得尤为关键。可以从某一列或若干列、某一行或若干行、某一个值或若干个值等环节入手,高效识别缺失值。
1. 识别缺失值
使用API函数isna()或isnull()可以判断数据框(DataFrame)对象的变量取值是否存在缺失值。使用方法如下所示。
(1)导入需要的包。
(2)加载数据集cars。
(3)判断变量取值是否存在缺失值。输出结果如图1.4和图1.5所示。
图1.4
图1.5
(4)统计变量取值存在缺失值的数量。
(5)计算变量取值不包括缺失值的数量。
(6)变量Miles_per_Gallon和变量Horsepower存在缺失值。查看变量Horsepower存在缺失值,并且变量Origin取值是"Europe"的记录。输出结果如图1.6所示。
图1.6
(7)使用API函数dropna()剔除包含缺失值的数据记录。这里以前20行数据记录为例,行索引出现间断情形,表明存在缺失值的数据记录已经被剔除,输出结果如图1.7所示。
(8)分析剔除包含缺失值的数据记录的数量变化。从属性shape的取值来看,二元元组的行数减少,变量个数没有变化。
图1.7
2. 处理缺失值
使用API函数fillna()填补存在缺失值的变量或数据记录。函数fillna()的参数既可以是数值,也可以是字典。
(1)使用数值0填补存在缺失值的数据记录。这里以前20行数据记录为例,使用数值0填补存在缺失值的数据记录,行索引连续有序,输出结果如图1.8所示。
(2)使用变量Miles_per_Gallon的均值填补存在缺失值的变量Miles_per_Gallon。输出结果如图1.9所示。
图1.8
图1.9
(3)在填补存在缺失值的变量Miles_per_Gallon之后,比较变量取值存在缺失值的数量变化。经过比较,只有变量Horsepower存在缺失值。输出结果如下。
(4)在填补存在缺失值的变量Miles_per_Gallon之后,比较变量取值不包括缺失值的数量记录的变化。经过比较,只有变量Horsepower存在缺失值。输出结果如下。
(5)分别使用均值和最大值填补变量Miles_per_Gallon和Horsepower。不同变量的数据记录数量相同,所有缺失值都填补完成。输出结果如下。
(6)使用API函数describe()展示数量型变量的描述统计。输出结果如图1.10所示。
图1.10
1.5.4 条件查询的操作方法
对DataFrame而言,条件查询可以使用Pandas。条件查询类似MySQL中的where子句,使用条件表达式获得布尔值进而筛选部分数据集或变量。为了更好地演示使用方法,下面使用数据集cars的前30行数据记录作为示例数据集。实现代码如下所示。
查询条件的设置方法,以变量类型划分,主要分为数量型变量、名义型变量和时间型变量。
数量型变量的条件表达式主要使用逻辑运算符“==”、“>=”、“<=”和“!=”等,例如,source.Miles_per_Gallon==14,可以称为精确查询。名义型变量的条件表达式主要使用API函数str.contains()设置查询字符串,例如,source["Origin"].str.contains("Euro"),包含查询字符串的数据记录都会以查询结果的形式返回,可以称为模糊查询。如果使用完整的变量取值,则等价于使用逻辑运算符“==”设置条件表达式,例如,source.Origin=="Europe",属于精确查询。时间型变量的条件表达式主要使用类pandas.Timestamp()设置查询时间戳(日期和时间),例如,source2.Year==pd.Timestamp("1982"),属于精确查询。
(1)查询变量Origin的取值等于"Europe"的数据记录。条件表达式既可以使用source.Origin=="Europe",也可以使用source["Origin"]=="Europe"。条件表达式的返回值是对象Series。条件查询结果如图1.11所示。
图1.11
(2)查询变量Origin的取值等于“Europe”,且变量Miles_per_Gallon的取值大于或等于15的数据记录。两个条件表达式都需要使用“()”,逻辑连接词且使用“&”,逻辑连接词“或”使用“|”。条件查询结果如图1.12所示。
图1.12
(3)查询变量Origin的取值等于“Europe”或变量Miles_per_Gallon的取值等于14的数据记录。条件查询结果如图1.13所示。
图1.13
(4)查询变量Origin的取值等于“Europe”或变量Miles_per_Gallon的取值等于14的数据记录。同时,返回的数据记录只显示依次包含变量Name、Miles_per_Gallon和Origin的数据记录。可以根据显示需求调整这些变量在列表中的顺序。条件查询结果如图1.14所示。
图1.14
(5)查询变量Miles_per_Gallon的取值大于或等于18,且变量Miles_per_Gallon的取值小于或等于25的数据记录。条件查询结果如图1.15所示。
图1.15
(6)查询变量Origin的取值包含“Euro”的数据记录。对名义型变量而言,可以使用API函数str.contains()设置查询条件,判断字符串模式或正则表达式是否匹配名义型变量的取值,返回布尔型对象Series。名义型变量Origin的条件查询结果如图1.16所示。
图1.16
(7)查询变量Name的取值包含“for”的数据记录。同时,查询结果的数据记录只包含部分变量。名义型变量Name的条件查询结果如图1.17所示。
图1.17
(8)查询变量Name的取值包含“(”的数据记录。按照正则表达式查询,需要使用"\("。名义型变量Name的条件查询结果如图1.18所示。
图1.18
(9)查询变量Name的取值包含“(”的数据记录。按照字符串查询,需要传递False给关键字参数regex。同时,查询结果的数据记录只包含部分变量。名义型变量Name的条件查询结果如图1.19所示。
图1.19
(10)查询变量Year的取值等于1970年的数据记录。对时间型变量而言,可以使用类pandas.Timestamp()设置查询日期和时间。使用完整数据集cars作为查询范围,同时,查询结果的数据记录只包含部分变量。时间型变量Year的条件查询结果如图1.20所示。
图1.20