结构化数据,我该拿你怎么办?

简介: 结构化数据,我该拿你怎么办?

首先介绍一下什么是结构化数据:


结构化数据,简单来说就是数据库。结合到典型场景中更容易理解,比如企业ERP、财务系统;医疗HIS数据库;教育一卡通;政府行政审批;其他核心数据库等。基本包括高速存储应用需求、数据备份需求、数据共享需求以及数据容灾需求。


结构化数据也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。与结构化数据相对的是不适于由数据库二维表来表现的非结构化数据,包括所有格式的办公文档、XML、HTML、各类报表、图片和咅频、视频信息等。支持非结构化数据的数据库采用多值字段、了字段和变长字段机制进行数据项的创建和管理,广泛应用于全文检索和各种多媒体信息处理领域。


在Python中使用什么去处理结构化数据:


Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。


pandas中有个叫DataFrame的东西,它便是专门用来处理结构化数据的。


那首先我们就先来创建一个dataframe:

在创建dataframe之前我们得需要引入两个模块,一个就是我们刚刚所说的pandas,还有一个就是numpy:

640.png


下面我们可以来定义一个dataframe对象了:

新建dataframe对象最常用的一个方法就是直接传递一个字典对象给DataFrame()构造函数,具体例子如下:

640.png

输出:

640.png


以上是创建了一个学生的信息,当然,如果你只想show某个指定的列可以直接指定(使用column直接指定即可,新建的dataframe每个column的顺序和你指定的顺序是一致的,和他们在字典中的顺序无关):

640.png

输出:


640.png

以上便是定义一个dataframe,除此之外还有个更简单的方法直接定义一个dataframe,这次我们不在需要借用字典了,我们直接定义一个构造函数,然后给予它三个参数,这三个参数分别是:数据矩阵,index的选项(就是上图输出中自动生成的01234),column的选项。例子如下:

640.png

输出:

640.png



如何从DataFrame中选取元素?


就拿刚刚的例子而言,如果我们想知道DataFrame所以列的名称,我们直接调用columns属性即可。

640.png

输出:

640.png

同理,想要看到所有的索引列表我们也直接可以调用index属性:

students.index

如果我们想要获取存储在数据结构中的所有元素,我们可以使用values属性来获取所有元素(数据类型是:<class 'numpy.ndarray'>):

students.values

输出:

640.png


对于想获取某个单独的列,我们可以直接将列名拿过来,类似于字典中的以键取值:(两种方法都可以,效果一样)

640.png

输出:

640.png


如果我们想读取某一行的记录我们可以使用ix属性来获取,例如我们现在来获取第二行(name索引为2的行)的记录:

640.png

输出:


640.png

那这边有一点要讲一下,ix属性也有个获取多行记录的方法,和列表的切片方法差不多,例如我想获取第二行,第三行,第四行的信息(索引值为123):

students.ix[1:3]    #[1:3]就代表从1到3,类似于list的切片

输出:


640.png

那如果只需要第二行和第四行(索引为1,3)怎么办??

很简单,我们只需要在ix属性里放一个列表即可:

students.ix[[1,3]] #逗号表示隔开

输出:

640.png


那如果我们只想取某个确定的值呢?

例如我们想把Tom这个名字给取出来,我们该怎么办?

students.ix[1]['name']

或者

students['name'][1]

以上两种方法都可以输出Tom。

那按照以上方法我们可以把值给取出来,也可以修改值(直接students['name'][1]=‘Alice’就可以完成更新)。


那我们现在想要添加一列新的元素,班长,他们的班长都是Tom同学,那此时我们该怎么办?


没错,模仿list,我们可以直接插入一个新的column:

640.png

输出:

640.png


那如果想删除某个列呢?

同样的模仿list的方法:

del students['monitor']

输出:


640.png

最后还要一个小的知识点,如果我们想把这个Dataframe的index和column进行互换,那我们以该怎么办?


学过线性代数的同学肯定立刻就知道了,我们可以直接使用它的转秩:

student.T

输出:

640.png


如果想把DataFrame转化成其他数据类型,我们可以使用:

students.to_dict() #默认outtype='dict'

输出:

{'ID': {0: 'SH0012', 1: 'GZ0034', 2: 'ZJ0021', 3: 'DL0042', 4: 'HK0017'}, 'age': {0: 23, 1: 24, 2: 23, 3: 25, 4: 23}, 'name': {0: 'John', 1: 'Tom', 2: 'Tony', 3: 'Stack', 4: 'Sherlock'}}


那现在留一个思考题,如何借助字典创建一个自定义index的DataFrame?(现在来说应该特别简单了)


下面还有一些DataFrame常用的方法:


排序

DataFrame提供了多种排序方式。

students.sort_index(axis=1, ascending=False)

sort_index可以以轴的标签进行排序。axis是指用于排序的轴,可选的值有0和1,默认为0即行标签(Y轴),1为按照列标签排序。 ascending是排序方式,默认为True即降序排列。

students.sort(columns='two')

students.sort(columns=['ID','age'],ascending=[0,1])

DataFrame也提供按照指定列进行排序,可以仅指定一个列作为排序标准(以单独列名作为columns的参数),也可以进行多重排序(columns的参数为一个列名的List,列名的出现顺序决定排序中的优先级),在多重排序中ascending参数也为一个List,分别与columns中的List元素对应。



读写数据

DataFrame可以方便的读写数据文件,最常见的文件为CSV或Excel。Pandas读写Excel文件需要openpyxl(Excel 2007),

xlrd/xlwt(Excel 2003)。

从CSV中读取数据:

df = pd.read_csv('foo.csv')

R中的对应函数:

df = read.csv('foo.csv')

将DataFrame写入CSV:

df.to_csv('foo.csv')

R中的对应函数:

df.to.csv('foo.csv')

从Excel中读取数据:

xls = ExcelFile('foo.xlsx')
xls.parse('sheet1', index_col=None, na_values=['NA'])

先定义一个Excel文件,用xls.parse解析sheet1的内容,index_col用于指定index列,na_values定义缺失值的标识。

将DataFrame写入Excel文件:

df.to_excel('foo.xlsx', sheet_name='sheet1')

默认的sheet为sheet1,也可以指定其他sheet名。


基本运算

Pandas支持基本的运算及向量化运算。

df.mean()#计算列的平均值,参数为轴,可选值为0或1.
默认为0,即按照列运算.

df.sum(1)#计算行的和

df.apply(lambda x: x.max() - x.min())#将一个函数应用到DataFrame的每一列,这里使用的是匿名lambda函数,与R中apply函数类似.



构建透视表

使用pivot_table和crosstab都可以创建数据透视表

df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
                   'B' : ['A', 'B', 'C'] * 4, 
                   'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2, 
                   'D' : np.random.randn(12), 'E' : np.random.randn(12)})
pd.pivot_table(df, values = 'D', rows = ['A', 'B'], cols = ['C'])#以A、B为行标签,以C为列标签将D列的值汇总求和
pd.crosstab(rows = ['A', 'B'], cols = ['C'], values = 'D')#以A、B为行标签,以C为列标签将D列的值汇总求和



时间序列分析

时间序列也是Pandas的一个特色。时间序列在Pandas中就是以Timestamp为索引的Series。

pandas提供to_datetime方法将代表时间的字符转化为Timestamp对象:

s = '2018-08-08 21:00:00'
ts = pd.to_datetime(s)

有时我们需要处理时区问题:

ts=pd.to_datetime(s,utc=True).tz_convert('Asia/Shanghai')

构建一个时间序列:

rng = pd.date_range('1/1/2018', periods=5, freq='M')
ts = pd.Series(randn(len(rng)), index=rng)

Pandas提供resample方法对时间序列的时间粒度进行调整:

ts_h=ts.resample('H', how='count')#M,5Min,1s

以上是将时间序列调整为小时,还可以支持月(M),分钟(Min)甚至秒(s)等。




今天就分享到这里吧!

相关文章
|
7月前
|
自然语言处理 中间件 测试技术
中间件数据格式结构化数据与非结构化数据之间的转换
中间件数据格式结构化数据与非结构化数据之间的转换
114 3
|
7月前
|
分布式计算
如何在MapReduce中处理非结构化数据?
如何在MapReduce中处理非结构化数据?
81 0
|
存储 数据管理 数据库
非结构化数据怎么盘点?
非结构化数据怎么盘点?
|
存储 自然语言处理 文字识别
非结构化数据怎么治理?
非结构化数据怎么治理?
|
存储 监控 负载均衡
海量非结构化数据存储中的小对象合并技术
随着人工智能, IoT 等技术的推广普及,智能监控,智能制造等新兴领域蓬勃发展,涌现出了越来越多的海量非结构化数据存储需求。
结构化总结与结构化思考之《金字塔原理》总结
无论是一次简单的汇报还是对于自己的学习过的知识的进行相应的总结,我们的信息要素总是没有经过结构化总结的。你是否会困惑一场汇报或者一些知识的总结该如何进行,或者你已经有了一些总结,但是还并不知道该如何结构化的组织它们,这个时候就可以采用金字塔结构进行组织。
结构化总结与结构化思考之《金字塔原理》总结
|
数据采集 存储 机器学习/深度学习
大数据数据采集的数据类型的非结构化数据
在大数据领域中,数据采集是一个至关重要的环节。除了结构化数据外,非结构化数据也是大数据采集的重要组成部分之一。本文将介绍大数据数据采集中的非结构化数据类型,以及如何对这些数据进行有效的采集和处理。
795 0
|
数据采集 存储 XML
大数据数据采集的数据类型的半结构化数据
在大数据采集中,我们会遇到各种类型的数据,其中半结构化数据是一种常见的数据类型。本文将介绍什么是半结构化数据以及如何有效地采集和处理该类型的数据。
616 0
|
存储 数据采集 SQL
大数据数据采集的数据类型的结构化数据
在大数据领域,数据采集是一个非常重要的环节,数据类型的结构化程度直接影响到后续的数据分析和挖掘工作。本文将介绍大数据数据采集中的结构化数据类型,以及如何对这些数据进行有效的采集和处理。
539 0
|
机器学习/深度学习 人工智能 监控
使用 Arize 监控非结构化数据(Arize)
为什么要 Embeddings? 我们认为 Embeddings 是人工智能和深度学习的基础。Embeddings 是深度学习模型如何表示模型所学习的结构、映射、层次结构和流形的核心。它们将现代深度学习从transformers扩展到编码器、解码器、自动编码器、推荐引擎、矩阵分解、SVD、图神经网络和生成模型——它们无处不在。