首先介绍一下什么是结构化数据:
结构化数据,简单来说就是数据库。结合到典型场景中更容易理解,比如企业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:
下面我们可以来定义一个dataframe对象了:
新建dataframe对象最常用的一个方法就是直接传递一个字典对象给DataFrame()构造函数,具体例子如下:
输出:
以上是创建了一个学生的信息,当然,如果你只想show某个指定的列可以直接指定(使用column直接指定即可,新建的dataframe每个column的顺序和你指定的顺序是一致的,和他们在字典中的顺序无关):
输出:
以上便是定义一个dataframe,除此之外还有个更简单的方法直接定义一个dataframe,这次我们不在需要借用字典了,我们直接定义一个构造函数,然后给予它三个参数,这三个参数分别是:数据矩阵,index的选项(就是上图输出中自动生成的01234),column的选项。例子如下:
输出:
如何从DataFrame中选取元素?
就拿刚刚的例子而言,如果我们想知道DataFrame所以列的名称,我们直接调用columns属性即可。
输出:
同理,想要看到所有的索引列表我们也直接可以调用index属性:
students.index
如果我们想要获取存储在数据结构中的所有元素,我们可以使用values属性来获取所有元素(数据类型是:<class 'numpy.ndarray'>):
students.values
输出:
对于想获取某个单独的列,我们可以直接将列名拿过来,类似于字典中的以键取值:(两种方法都可以,效果一样)
输出:
如果我们想读取某一行的记录我们可以使用ix属性来获取,例如我们现在来获取第二行(name索引为2的行)的记录:
输出:
那这边有一点要讲一下,ix属性也有个获取多行记录的方法,和列表的切片方法差不多,例如我想获取第二行,第三行,第四行的信息(索引值为123):
students.ix[1:3] #[1:3]就代表从1到3,类似于list的切片
输出:
那如果只需要第二行和第四行(索引为1,3)怎么办??
很简单,我们只需要在ix属性里放一个列表即可:
students.ix[[1,3]] #逗号表示隔开
输出:
那如果我们只想取某个确定的值呢?
例如我们想把Tom这个名字给取出来,我们该怎么办?
students.ix[1]['name']
或者
students['name'][1]
以上两种方法都可以输出Tom。
那按照以上方法我们可以把值给取出来,也可以修改值(直接students['name'][1]=‘Alice’就可以完成更新)。
那我们现在想要添加一列新的元素,班长,他们的班长都是Tom同学,那此时我们该怎么办?
没错,模仿list,我们可以直接插入一个新的column:
输出:
那如果想删除某个列呢?
同样的模仿list的方法:
del students['monitor']
输出:
最后还要一个小的知识点,如果我们想把这个Dataframe的index和column进行互换,那我们以该怎么办?
学过线性代数的同学肯定立刻就知道了,我们可以直接使用它的转秩:
student.T
输出:
如果想把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)等。
今天就分享到这里吧!