pandas 数据结构和数据类型

pandas是基于NumPy构建的模块,是数据分析必不可少的包之一,通常情况下,引入pandas的约定,只要在代码中看到pd,就要联想到pandas:

import pandas as pd

pandas包含两种最主要数据结构:序列(Series)和数据框(DataFrame)。对于这两个数据结构,有两个最基本的概念:轴(Axis)和标签(Label),对于二维数据结构,轴是指行和列,轴标签是指行的索引和列的名称,存储轴标签的数据结构是Index结构。

对于这两个数据结构,还有一个特性:数据对齐是天生存在的,轴和标签之间的连接是内在的,不会被破坏,除非有意为之。这意味着,每行都有一个索引,通过索引可以定位到该行;每列都有一个列名,通过列名可以定位到该列;通过行索引和列名称,可以唯一定位到一个唯一的数据点(cell)的数据值。

一,数据框的数据结构

数据框(DataFrame)存储的是二维数据,数据框的结构由row和column构成,每一行都有一个row label,每一列都有一个column label,把row和column称作axis,把row label和column label称作axis label。通常情况下,column label 是文本类型,是列名称(column name),而row label是数值类型,也称作行索引(row index)。

从DataFrame的结构图中可以看出,DataFrame结构由二部分构成:深色的区域叫做Axis Label(轴标签),浅灰色的区域是data,对于Axis,左侧的轴称作index、上方的轴称作columns,而轴的结构实际上是一个Index类型。

import pandas as pd

In [2]: df = pd.DataFrame({
   ...:     "Name": ["Braund",
   ...:              "Allen",
   ...:              "Bonnell"],
   ...:     "Age": [22, 35, 58],
   ...:     "Sex": ["male", "male", "female"]}
   ...: )
   ...: 

In [3]: df
Out[3]: 
    Name     Age   Sex
0   Braund   22    male
1   Allen    35    male
2   Bonnell  58    female

该数据框(DataFrame) 有三行三列,行索引分别是0、1、2,列名称分别是Name、Age和Sex。每一列的数据类型是相同的,对于Name和Sex列,它们的数据类型是文本,而Age列的数据类型是整数型。

二,序列的数据结构

序列(Series)是一维结构,DataFrame的每一列都是一个序列(Series),序列结构只有行索引(row index),没有列名称(column name),但是序列有Name、dtype和index属性,其中Name属性是指序列的名称,dtype属性是指序列值的类型,index属性是序列的索引。序列存储的数据的数据类型是相同的。

从序列的结构图中,可以看出,实际上,序列包含数据(data)和索引(index)。左侧是索引,右侧是数据。

从DataFrame中选择Age列,这是一个Series结构,

In [4]: df["Age"]
Out[4]: 
0    22
1    35
2    58
Name: Age, dtype: int64

序列是由一组数据(各种NumPy数据类型),以及一组与之相关的行标签(索引)组成,序列要求数据类型是相同的。

当然也可以创建一个新的序列,通过以下函数来创建一个新的序列:序列可以看作是一维数组:由于没有显式为Series指定索引,pandas会自动创建一个从0到length(Series)-1的整数型索引。

>>> cat=pd.Series(data=['a','b'],name='Category')
>>> cat
0    a
1    b
Name: Category, dtype: object

可以使用函数pandas.Series.rename() 来修改序列的name。

三,序列和数据框之间的关系 

序列和数据框之间的关系是:数据框的每一列都是一个序列,数据框的每一行都是一个序列。

数据框(DataFrame)是二维的数据结构,由一组有序的列构成,每列的数据类型是相同的,列与列之间的数据类型可以不相同。数据框的结构是行和列,每一列都有列名(或叫做列索引、列标签),每一行都有行索引,行索引通常是正整数,也可以是文本类型。

序列和数据框之间是密切关联的,当访问DataFrame的一行时,pandas自动把该行转换为序列;当访问DataFrame的一列时,Pandas也自动把该列转换为序列。

四,轴标签,也称作索引

存储轴标签的数据结构是Index,对于数据框,行标签(即行索引)和列名称(即列索引)是由Index对象存储的;对于序列,行索引是由Index对象存储的。索引对象是不可修改的,类似一个固定大小的数组。

对于索引,还可以通过序号来访问,序号是自动生成的,从0开始。

轴标签的最重要的作用是:

  • 唯一标识数据,用于定位数据
  • 用于数据对齐
  • 获取和设置数据集的子集。

数据框和序列对象都有一个属性index,用于获取行标签,对于数据框,还有一个columns属性,用于获取列标签:

>>> df.index
RangeIndex(start=0, stop=3, step=1)

>>>df.columns
Index(['Name', 'Age', 'Sex'], dtype='object')

Series和DataFrame可以看作一个字典结构:索引是Key,数据值是Value,通过索引结构来唯一标识数据值。

五,数据类型

在大多数情况下,pandas使用NumPy的数组和dtypes作为序列和数据框中列的数据类型,NumPy支持的数据类型是float、int、bool、timedelta64[ns]。pandas扩展了NumPy的类型系统,用dtype属性来显示元素的数据类型,pandas主要有以下几种dtype:

  • 字符串类型:object
  • 整数类型:Int64,Int32,Int16, Int8 
  • 无符号整数:UInt64,UInt32,UInt16, UInt8 
  • 浮点数类型:float64,float32
  • 日期和时间类型:datetime64[ns]、datetime64[ns, tz]、timedelta[ns]
  • 布尔类型:bool

1,查看变量的类型

查看变量的数据类型,使用type(var)函数

type(obj)

2,特殊的objct类型

通常情况下,使用object表示字符类型;

>>> pd.Series(['a', 'b', 'c'], dtype="object")
0    a
1    b
2    c
dtype: object

对于object类型,如果一个pandas对象在单列中包括多个dtype,那么使用object来容纳所有的dtype。

# string data forces an ``object`` dtype
In [333]: pd.Series([1, 2, 3, 6., 'foo'])
Out[333]: 
0      1
1      2
2      3
3      6
4    foo
dtype: object

3,数值类型

pandas中的整数类型和浮点数类型可以为空(NULL),在定义数据组或序列时,使用dtype参数来定义整数类型:

arr = pd.array([1, 2, np.nan], dtype=pd.Int64Dtype())
pd.array([1, 2, np.nan], dtype="Int64")
pd.Series([1, 2, np.nan], dtype="Int32")

使用float32、float64定义浮点数类型:

>>> pd.Series([1, 2, np.nan], dtype="float32")
0    1.0
1    2.0
2    NaN
dtype: float32

4,日期和时间类型类型

datetime64[ns] 表示的是日期和时间类型

>>> pd.Series(['2018-07-01', '2019-07-01', '2019-10-01'], dtype="datetime64[ns]")
0   2018-07-01
1   2019-07-01
2   2019-10-01
dtype: datetime64[ns]

六,类型转换

可以使用astype()函数,显式把对象的类型从一个类型强制转换为指定的数据类型:

>>> pd.Series(['2018-07-01', '2019-07-01', '2019-10-01']).astype('datetime64[ns]')
0   2018-07-01
1   2019-07-01
2   2019-10-01
dtype: datetime64[ns]

pandas还有类型转换的特殊函数,用于转换为特定的数据类型:

  • to_numeric() 
  • to_datetime() 
  • to_timedelta() 

比如,把序列转换为日期类型:

>>> pd.to_datetime(pd.Series(['2018-07-01', '2019-07-01', '2019-10-01']))
0   2018-07-01
1   2019-07-01
2   2019-10-01
dtype: datetime64[ns]

 

 

参考文档:

pandas overview

posted @ 2019-09-19 11:07  悦光阴  阅读(16134)  评论(0编辑  收藏  举报