• 《利用python进行数据分析》读书笔记--第六章 数据加载、存储与文件格式


    http://www.cnblogs.com/batteryhp/p/5021858.html

    输入输出一般分为下面几类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据。利用Web API操作网络资源。

    1、读写文本格式的数据

    自己感觉读写文件有时候“需要运气”,经常需要手工调整。因为其简单的文件交互语法、直观的数据结构,以及诸如元组打包解包之类的便利功能,Python在文本和文件处理方面已经成为一门招人喜欢的语言。pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。见下表:

    image

    下面大致介绍一下这些函数在文本数据转换为DataFrame时的一些技术。可以分为一下几类:

    • 索引:将一个或者多个列当作返回的DataFrame处理,以及是否从文件、用户获取列名。
    • 类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等。
    • 日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
    • 迭代:支持对大文件进行逐块迭代。
    • 不规整数据问题:跳过一些行、页脚、注释或者其他不要的东西

    pandas读取文件会自动推断数据类型,不用指定。

    read_csv为例

    用names重新规定列名,用index_col指定索引,也可以将多个列组合作为层次化索引。可以编写正则表达式规定分隔符。用skiprows跳过某些行。pandas会用NA、-1.#IND、NULL等进行标记。用na_values用来不同的NA标记值。下面是read_csv/read_table参数:

    image

    image

    逐块读取文本文件

    处理很大的文件时,或找出大文件中的参数集以便于后续处理时,可能只想读取一部分或者逐块对文件进行迭代。nrows指定读取多少行。要逐块读取文件,需要设置chunksize(行数)。

    将数据写出到文本格式

    用to_csv方法写出到csv文件中。参数sep标明分隔符。na_rep标明空白字符串的代替值。index header标明是否写出行列标签,默认是写出。用cols限制并以指定顺序写出某些列。

    Series也有to_csv方法。用一些整理工作(无header行,第一列作索引)就能用read_csv读取为Series,当然还有一个更方便的from_csv,Series.from_csv。

    手工处理分隔符格式

    有些奇葩文件需要进行处理以后再读。Python内置的csv模块可以读取任何单字符分隔符文件。将打开的文件传递给csv.reader。csv文件的形式有很多,只需定义csv.Dialect的一个子类即可定义新格式(如专门的分隔符、字符串引用约定、行结束符等):

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import pandas.io.data  as web
    import csv
    
    f = open('ex6.csv')
    reader = csv.reader(f)
    for line in reader:
        print line
    lines = list(csv.reader(open('ex7.csv')))
    header,values = lines[0],lines[1:]
    print header
    print values
    #下面的 * 应该是取出值的意思
    data_dict = {h:v for h,v in zip(header,zip(*values))}
    print data_dict
    class my_dialect(csv.Dialect):
        lineterminator = '
    '
        delimiter = ';'
        quotechar = '"'
    
    reader = csv.reader(f,dialect=my_dialect)
    #csv语支的参数也可以用参数的形式给出
    reader = csv.reader(f,delimiter = '|')
    复制代码

    image

    对于那些使用复杂分隔符或多字符分隔符的文件,csv文件就无能为力了。这种情况下用split或者re.split进行拆分合整理工作。要手工输出分隔符文件,可以使用csv.writer。它接受一个已打开且可写的文件对象以及跟cav.reader相同的那些语支和格式化选项。

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import pandas.io.data  as web
    import csv
    
    with open('mydata.csv','w') as f:
        writer = csv.writer(f,lineterminator = '
    ')
        writer.writerow(('one','two','three'))
        writer.writerow(('1','2','3'))
    复制代码

    JSON数据

    除空值null和一些其他的细微差别(如列表末尾不允许存在多余的逗号)之外,JSON非常接近有效Python代码。基本数据类型有对象(字典)、数组(列表)、字符串、数值、布尔值以及NULL。对象中所有的键都必须是字符串(非常重要)。用json模块,json.loads可以将字符串转换成Python形式,即可以将对象读取为python字典。

    相反的,json.dumps可以将python对象转换为json格式。

    XML和HTML:Web信息收集

    lxml可以读取xml和html格式数据并处理。这部分用到的时候再研究。

    2、二进制数据文件

    实现数据的二进制格式最简单的方法之一是使用Python内置的pickle序列化。为了使用方便,pandas对象都有一个用于将数据以pickle形式保存到磁盘上的save方法。

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import pandas.io.data as web
    import csv
    
    frame = pd.read_csv('ex1.csv')
    print frame
    frame.save('frame_pickle') #存储为二进制文件
    ok = pd.load('frame_pickle') #load函数
    #ok1 = pd.read_table('frame_pickle') #不能用read_table函数
    #print ok1
    print ok
    复制代码

    pickle,作者建议用作短期存储,因为会遇到解析版本问题。

    使用HDF5格式

    很多工具都能实现高效读写磁盘上以二进制格式存储的科学数据。HDF5就是一个流行工业级库,是一个C库,有Java、Python、MATLAB等多种接口。这部分暂时不看。

    读取Excel数据

    支持excel2003及更高版本的excel文件。用pandas中的ExcelFile类即可,需要安装xlrd和openpyxl包。

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import pandas.io.data as web
    import csv
    
    xls_file = pd.ExcelFile('ex1.xlsx')
    table = xls_file.parse('ex1')
    print table
    复制代码

    使用HTML和Web API

    许多网站都有一些通过JSON或其他格式提供数据的公共API。用requests包等可以实现。这部分暂时不看。

    使用数据库

    数据从SQL中加载到DataFrame比较简单,此外pandas还有一些能够简化该过程的函数。作者是用一款SQLite数据库,用sqlite3驱动器。作者还举了MongoDB中数据的例子。暂时不看。

  • 相关阅读:
    《我是一只IT小小鸟》
    &&、||、?:、,四个运算符的求值顺序
    C Traps and Pitfalls 练习4.2
    “检测到LoaderLock”的解决办法
    VS中代码对齐等快捷键
    贪心 Greedy Algorithms
    这些最基本的程序优化方法你用过吗?
    内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
    [原创]让对话框的控件支持tooltips
    Debug 运行正常但 Release 失败的问题,Debug 和 Release 编译方式的本质区别
  • 原文地址:https://www.cnblogs.com/virusolf/p/6213627.html
Copyright © 2020-2023  润新知