利用Python进行数据分析(八)

作者: BrainZou | 来源:发表于2018-01-04 22:44 被阅读78次

    数据加载、存储与文件格式

    既然要对大量的数据进行分析,而数据当然不可能平白无故的产生。其输入输出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式(txt table csv等),加载数据库中的数据,利用Web API操作网络资源。

    读写文本格式的数据

    函数 说明
    read_csv 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号
    read_table 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符("\t")
    read_fwf 读取定宽列格式数据(也就是说,没有分隔符)
    read_clipboard 读取剪贴板中的数据,可以看做read table的剪贴板版.在将网页转换为表格时很有用

    pandas可以将表格型数据读取为DataFrame对象。常用函数如下,其中read_csv 和read_table最为常用。

    函数 说明
    read_csv 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号
    read_table 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符("\t")
    read_fwf 读取定宽列格式数据(也就是说,没有分隔符)
    read_clipboard 读取剪贴板中的数据,可以看做read table的剪贴板版.在将网页转换为表格时很有用

    类型推断(type inference)是最重要的功能之一,也就是说.你不需要指定列的类型到底是数值、整数、布尔值,还是字符串。日期和其他自定义类型的处理需要多花点工夫才行。

    #默认逗号是分隔符
    df = pd.read_csv('cho6/exi.csv')
    #用read_table则要指明逗号
    pd.read_table('cho6/exi.csv', sep=',')
    #如果分隔符不为逗号怎么办呢?可以使用read_table  sep使用正则表达式即可(如‘\s+’意义是不定数目的空格作为分隔符)。
    #names参数可以指明列名 或者 header=None使用默认
    #index cot='message 可以指明需要用来做索引的列得到下列这种效果。
                  a    b    c    d
    message
    hello         1    2    3    4
    world         5    6    7    8
    foo           9    10   11   12 
    
    也可以传入多个列作为前面说到过的层次化索引。得到下面这种效果:
                      value1       value2
    key1  key2        
    one     a        1                  2
            b        3                  4
            c        5                  6
            d        9                 10
    two     a       11                 12
    

    当然你也可以选择跳过一些行:

    #跳过第一,三,四行
    pd.read_csv('cho6/ex4.csv', skiprows=[0, 2, 3])
    

    缺失值也是很常见的一种情况。

    #指明表示缺失值的字符串(说明csv中Null代表缺失)
    result = pd.read_csv('ch06/ex5.csv', na_values=['NULL'])
    #为各列指明不同的NA标记值
    #message列foo和NA代表缺失,something列two代表缺失。
    sentinels = {'message
    'foo', 'NA'], 'something':two']}
    pd.read_csv('cho6/ex5.csv', navalues=sentinels)
    
    read_csv read_table常用参数 说明
    path 表示文件系统位置、URL、文件型对象的字符串
    sep/delimiter 用来拆分的字符序列或正则表达式
    header 作列名的行号,默认为0,没有时设置为None
    index_col 作行索引的列编号或列名 也可以多个组成的列表(层次化索引)
    names 结果的列名列表
    skiprows 值:忽略的行数。列表:跳过的行号
    na_values 被认为是缺失的值
    comment 用干将注释信息从行尾拆分出去的字符(一个或多个)
    parse_dates 尝试将数据解析为日期.默认为False。如果为True,则尝试解析所有列。此外,还可以指定需要解析的一组列号或列名。如果列表的元素为列表或元组,就会将多个列组合到一起再进行日期解析工作(例如,日期/时间分别位于两个列中)
    keep_date_col 如果连接多列解析日期,则保持参与连接的列。默认为false
    converters 由列号/列名跟函数之间的映射关系组成的字典。例如,{'foo': f}会对foo列的所有值应用函数f
    dayfirst 当解析有歧义的日期时,将其看做国际格式(例如,7/6/2012一June7, 2012)。默认为False
    date_parser 用于解析日期的函数
    nrows 需要读取的行数(从文件开始处算起)
    iteFator 返回一个Textparser以便逐块读取文件
    chunksize 文件块的大小(用于迭代)
    skip_footer 需要忽略的行数(从文件末尾处算起)
    verbose 打印各种解析器输出信息,比如“非数值列中缺失值的数量”等
    encoding 用于unicode的文本编码格式。
    squeeze 如果数据经解析后仅含一列,则返回Series
    thousands 千分位分隔符,如,或者.

    逐块读取文本文件

    简单的只读取五行 参数 nrows=5
    逐步迭代读取 chunksize

    chunker = pd.read_csv('cho6/ex6.csv', chunksize=loo0)
    tot = Series([])
    for piece in chunker:
        tot = tot.add(piece['key'].value_counts(), fill_value=0)
    tot = tot. order(ascending=False)
    #上面就做到了对整个csv逐步的读取 最后统计出key这列分别出现次数
    

    TextParser还有一个get_chunk方法,它使你可以读取任意大小的块。

    将数据写出到文本格式

    上面的过程也是能反过来的,即DateFrame可以通过to_csv方法得到一个以逗号分隔的文件。
    相同的,设置参数sep可以指定分割符。
    缺失值指定则使用的是na_rep='NULL'这个参数等等。
    Series也有to_csv方法:

    ts.to_csv('cho6/tseries.csv')
    #读csv
    Series.fron_csv('cho6/tseries.csv', parse dates=True)
    

    手工处理分割符格式

    对于比较畸形的文件,直接使用read_table不成功时则需要手工来处理。比如下面这个csv:
    "a","b","c"
    "1","2","3"
    "1","2","3","4"
    怎么处理呢,如下:

    import csv
    f = open('ch06/ex7.csv')
    reader = csv.reader(f)
    for line in reader:
         print line
    #已移除引号
    ['a','b','c']
    ['1','2','3']
    ['1','2','3','4']
    lines = list(csv.reader(open('ch06/ex7.csv')))
    header,values = lines[0],lines[1:]
    data_dict = {h: v for h, v in  zip(header,zip(*values))}
    data_dict
    {'a':('1','1'),'b':('2','2'),'c':('3','3')}
    

    csv可以指定各种格式,通过下面这种定义一个csv.Dialect的一个子类的方法:

    class my_dialect(csv.Dialect):
        lineterminator = '\n'
        delimiter = ';'
        quotechar = ' " '
    reader = csv.reader(f,diaect = my_dialect)
    #也可以直接给csv.reader,如下:
    reader = csv.reader(f, delimiter='|')
    
    参数 说明
    delimiter 用于分隔字段的单字符字符串。默认为","
    lineterminator 用于写操作的行结束符,默认为“\r\n"。读操作将忽略此选项,它能认出跨平台的行结束符
    quetechar 用于带有特殊字符(如分隔符)的字段的引用符号。默认为"·"
    quoting 引用约定。可选值包括csv.QUOTE_ALL(引用所有字段),csv.QUOTE_MINIMAL(只引用带有诸如分隔符之类特殊字符的字段)、csv.QUOTE_NONNUMERIC以及csv.QUOTE_NON(不引用)。完整信息请参考Python的文档.默认为QUOTE_MINIMAL
    skipinitialspace 忽略分隔符后面的空白符。默认为False
    doublequote 如何处理字段内的引用符号。如果为True,则双写。完整信息及行为请参见在线文档
    escapechar 用于对分隔符进行转义的字符串(如果quoting被设置为csv.QUOTE_NONE的话)。默认禁用

    JSON数据

    import json
    #通过json.loads可将JSON数据字符串转换成Python形式:
    result = json.loads(obj)
    #json.dumps则把Python对象转换成JSON格式:
    asjson = json.dumps(result)
    #
    siblings = DataFrame(result['siblings'], columns['names','age'])
    siblings
    out:    name  age
    0        Scott    25
    1        Katie    33
    

    XML和HTML:Web信息收集

    有许多的库都可以用来读取XML和HTML格式,比如lxml。

    from lxml.html import parse
    from urllib2 import urlopen
    parsed = parse(urlopen('http://finance.yahoo.com/q/op?s=AAPL+Options'))
    doc = parsed.getroot()
    

    得到这个对象后就可以为所欲为了。这个如果接触过爬虫方面可能就不感觉陌生了。
    比如

    #找到所有链接(即a标签)
    links = doc.findall('.//a')
    #上面得到的只是链接那个对象,要得到链接文本还需要:
    links[28].get('href')
    out:
    'http://biz.yahoo.com/special.html'
    

    总结

    本章节主要就是读取到txt csv table json xml 格式的文件,转化到Python里进行处理。

    相关文章

      网友评论

        本文标题:利用Python进行数据分析(八)

        本文链接:https://www.haomeiwen.com/subject/creknxtx.html