Pandas
作者:PureFFFmennory
上一节:5.1 Pandas的数据结构简介(上):Series类型
PureFFFmennory:Pandas_操作数据集合基础 5.1 Pandas的数据结构简介(上)zhuanlan.zhihu.com![4d522d681aac48396d002fa85cb6b164.png](https://img-blog.csdnimg.cn/img_convert/4d522d681aac48396d002fa85cb6b164.png)
注:本节代码开始均默认读者已经导入pandas(import pandas as pd),本系列文章的代码均在在python3.7环境下运行。
5.1 Pandas的数据结构简介(上):DataFrame类型
DataFrame
DataFrame代表一个矩形数据表,并包含一个有序的列集合,每个列可以是不同类型的值(数字,字符串,布尔值等)。DataFrame同时具有行索引和列索引;可以将其视为所有共享相同索引的Series的dict。在后台,数据储存为一个或多个二维块,而不是列表,dict或其他一维数组的集合。DataFrame内部详细信息不在本文章的讨论范围之内。
注:虽然DataFrame在物理上是二维的,但你可以使用它通过分层索引以表格格式表示高维数据,我们将在后面提到,是Pandas中一些关于更高级的数据处理功能的组成部分。
构造DataFrame的方法有很多,尽管最常见的方法之一是用等长列表或NumPy数组的dict。
>>
像Series一样,结果将自动分配索引于DataFrame,并且按排序顺序放置各列:
输出结果:
>>
如果你用的是Jupyter笔记本,则Pandas的DataFrame对象将显示为对浏览器更友好的HTML表格。
对于大型DataFrame,head方法仅选择前5行:
>>
输出结果:
>>
如果你指定列的顺序,则DataFrame的列将按一下的顺序排列:
>>
输出结果:
>>
如果你传递一个dict中未包含的列,那么它将在结果中以缺失值的方式出现:
>>
输出结果:
>>
可以通过类似dict的符号或属性将DataFrame中的列检索为Series:
>>
输出结果:
>>
注:为方便起见,这里类属性的访问(如frame2.year)和列名的制表符访问均被Python接受。frame2[column]适用于任何列名,但是frame2.column仅在列名有效时才可访问。
这里我们返回的Series与DataFrame具有相同的索引,并且已经正确设置了它们的name属性。
还可以通过具有特殊loc属性的位置或名称来检索行(稍后将对此进行更多介绍):
>>
输出结果:
>>
year 2002
state Ohio
pop 3.6
debt NaN
Name: three, dtype: object
列可以通过分配修改,例如,可以为空的'debt'列分配标量值或数组:
>>
输出结果:
>>
当你将列表或数组分配给列时,该值的长度必须与DataFrame的长度匹配。如果你分配一个Series,则其标签将完全与DataFrame的索引对齐,从而在所有有“孔”的地方插入缺失值:
>>
输出结果:
>>
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7
six 2003 Nevada 3.2 NaN
分配不存在的列将创建一个新列,与dict一样,del关键字将删除列。
作为del的示例,我首先添加一个新的布尔值列,其中state列等于'Ohio':
>>
输出结果:
>>
注:新列的创建不能用frame2.eastern的语法。
然后可以使用del方法删除此列:
>>
输出结果:
>>
注:从索引DataFrame返回的列是基础数据的view,而不是副本。因此,对Series的任何就地修改都将反映在DataFrame中。该列可以使用Series的copy方法显式的复制。
数据的另一种常见形式是dict的嵌套:
>>
如果将嵌套的dict传递到DataFrame,那么pandas会将外部dict键解释为列,内部键解释为行:
>>
输出结果:
>>
你可以使用与NumPy数组类似的语法进行转置DataFrame(交换行于列):
>>
输出结果:
>>
dict内部的键被组合并排序以形成结果中的索引。如果指定了显式索引,则情况将并非如此:
>>
输出结果:
>>
Series的dict的处理方式大致相同:
>>
输出结果:
>>
有关可以传递DataFrame构造函数的完整列表如下:
![a2094e8112b19231de44300fe8e55cba.png](https://img-blog.csdnimg.cn/img_convert/a2094e8112b19231de44300fe8e55cba.png)
如果DataFrame的索引和列设置其name属性,则还将显示以下内容:
>>
输出结果:
>>
与Series一样,values属性以二维ndarry的形式返回DataFrame中包含的数据:
>>
输出结果:
>>
如果DataFrame的列是不同的dtype,则将选择values数组的dtype来容纳所有列:
>>
输出结果:
>>
索引对象
pandas的索引(index)对象负责保存轴标签和其他元数据(例如轴名称)。构造Series或DataFrame时使用的任何数组或其他标签序列都在内部转换为Index:
>>
输出结果:
>>
Index对象是不可变的,因此用户无法对其进行修改:
>>
不变性使它在数据结构之间共享Index对象更加安全:
>>
输出结果:
>>
有些用户通常不会利用索引提供的功能,但是由于某些操作会产生包含索引数据的结果,因此了解它们的工作方式非常重要。
除了像数组一样,索引的行为还类似于固定大小的集合:
>>
输出结果:
>>
与Python集合不同,pandas索引可以包含重复标签:
>>
输出结果:
>>
具有重复标签的选择将选择所有出现的标签:
每个索引都有许多用于设置逻辑的方法和属性,这些逻辑可以回答有关其包含的数据的其他常见问题,见下表:
![1346a1e112844f797391824ba27960e9.png](https://img-blog.csdnimg.cn/img_convert/1346a1e112844f797391824ba27960e9.png)