zoukankan      html  css  js  c++  java
  • 使用pandas处理大型CSV文件

    # -*-  coding:utf-8 -*-
    '''
    CSV 常用API
    
    1)reader(csvfile[, dialect='excel'][, fmtparam]),主要用于CSV 文件的读取,返回一个
    reader 对象用于在CSV 文件内容上进行行迭代。
             参数:
             csvfile,需要是支持迭代(Iterator)的对象,通常对文件(file)对象或者列表(list)对象都是适用的,并且每次调用next() 方法的返回值是字符串(string);
             dialect 的默认值为excel,与excel 兼容;
             fmtparam 是一系列参数列表,主要用于需要覆盖默认的Dialect设置的情形
             
    2)csv.writer(csvfile, dialect='excel', **fmtparams),用于写入CSV 文件。
    
    with open('data.csv', 'wb') as csvfile:
        csvwriter = csv.writer(csvfile, dialect='excel',delimiter="|",quotechar='"',
                      quoting=csv.QUOTE_MINIMAL)
        csvwriter .writerow(["1/3/09 14:44","'Product1'","1200''","Visa","Gouya"])
        # 写入行
                输出形式为: 1/3/09 14:44|'Product1'|1200''|Visa|Gouya
    
    3)csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, 
    dialect='excel',*args, **kwds),同reader() 方法类似,不同的是将读入的信息映射到一个字典中去,其中字
                 典的key 由fieldnames 指定,该值省略的话将使用CSV 文件第一行的数据作为key 值。如果
                 读入行的字段的个数大于filednames 中指定的个数,多余的字段名将会存放在restkey 中,而
        restval 主要用于当读取行的域的个数小于fieldnames 的时候,它的值将会被用作剩下的key对应的值。
        
    4)csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', 
    dialect='excel', *args,**kwds),用于支持字典的写入。    
        
    '''
    import csv
    #DictWriter
    with open('C:\test.csv', 'wb') as csv_file:
        # 设置列名称
        FIELDS = ['Transaction_date', 'Product', 'Price', 'Payment_Type']
        writer = csv.DictWriter(csv_file, fieldnames=FIELDS)
        # 写入列名称
        writer.writerow(dict(zip(FIELDS, FIELDS)))
        d = {'Transaction_date':'1/2/09 6:17','Product':'Product1','Price':'1200',
               'Payment_Type':'Mastercard'}
        # 写入一行 
        writer.writerow(d)
        
    with open('C:\test.csv', 'rb') as csv_file:
        for d in csv.DictReader(csv_file):
            print d
            
    '''
    Pandas 即Python Data Analysis Library,是为了解决数据分析而创建的第三方工具,,它
    不仅提供了丰富的数据模型,而且支持多种文件格式处理,包括CSV、HDF5、HTML 等,
    能够提供高效的大型数据处理。其支持的两种数据结构——Series 和DataFrame——是数据处
    理的基础。下面先来介绍这两种数据结构。
    
    Series:它是一种类似数组的带索引的一维数据结构,支持的类型与NumPy 兼容。如
    果不指定索引,默认为0 到N-1。通过obj.values() 和obj.index() 可以分别获取值和索
    引。当给Series 传递一个字典的时候,Series 的索引将根据字典中的键排序。如果传
    入字典的时候同时重新指定了index 参数,当index 与字典中的键不匹配的时候,会
    出现时数据丢失的情况,标记为NaN。
    
    import pandas
    #在pandas 中用函数isnull() 和notnull() 来检测数据是否丢失。
    
    >>> obj1 = Series([1, 'a', (1,2), 3], index=['a', 'b', 'c', 'd'])
    >>> obj1#value 和index 一一匹配
    a 1
    b a
    c (1, 2)
    d 3
    dtype: object
    >>> obj2=Series({"Book":"Python","Author":"Dan","ISBN":"011334","Price":25},inde
    x=['book','Author','ISBM','Price'])
    >>> obj2.isnull()
    book True # 指定的index 与字典的键不匹配,发生数据丢失
    Author False
    ISBM True # 指定的index 与字典的键不匹配,发生数据丢失
    Price False
    dtype: bool
    
    ‰DataFrame :类似于电子表格,其数据为排好序的数据列的集合,每一列都可以是
    不同的数据类型,它类似于一个二维数据结构,支持行和列的索引。和Series 一
    样,索引会自动分配并且能根据指定的列进行排序。使用最多的方式是通过一个长
    度相等的列表的字典来构建。构建一个DataFrame 最常用的方式是用一个相等长度
    列表的字典或NumPy 数组。DataFrame 也可以通过columns 指定序列的顺序进行
    排序。
    
    >>> data = {'OrderDate': ['1-6-10', '1-23-10', '2-9-10', '2-26-10', '3-15-10'],
    ... 'Region': ['East', 'Central', 'Central', 'West', 'E ast'],
    ... 'Rep': ['Jones', 'Kivell', 'Jardine', 'Gill', 'Sorv ino']}
    >>>
    >>> DataFrame(data,columns=['OrderDate','Region','Rep'])# 通过字典构建,按照cloumns 指定的顺序排序
    OrderDate Region Rep
    1-6-10 East Jones
    1-23-10 Central Kivell
    2-9-10 Central Jardine
    2-26-10 West Gill
    3-15-10 East Sorvino
    
    #Pandas 中处理CSV 文件的函数主要为read_csv() 和to_csv() 这两个,其中read_csv() 读取CSV 文件的内容并返回DataFrame,to_csv() 则是其逆过程。
    
    1)指定读取部分列和文件的行数。具体的实现代码如下:
    df = pd.read_csv("SampleData.csv",nrows=5,usecols=['OrderDate','Item','Total'])
    
    方法read_csv() 的参数nrows 指定读取文件的行数,usecols 指定所要读取的列的列名,
    如果没有列名,可直接使用索引0、1、...、n-1。上述两个参数对大文件处理非常有用,可
    以避免读入整个文件而只选取所需要部分进行读取
    
    2)设置CSV 文件与excel 兼容。dialect 参数可以是string 也可以是csv.Dialect 的实例。
    如果将图4-2 所示的文件格式改为使用“ |”分隔符,则需要设置dialect 相关的参数。error_
    bad_lines 设置为False,当记录不符合要求的时候,如记录所包含的列数与文件列设置不相
    等时可以直接忽略这些列。下面的代码用于设置CSV 文件与excel 兼容,其中分隔符为“| ”,
    而error_bad_lines=False 会直接忽略不符合要求的记录。
    
    >>> dia = csv.excel()
    >>> dia.delimiter="|" #设置分隔符
    >>> pd.read_csv("SD.csv")
    OrderDate|Region|Rep|Item|Units|Unit Cost|Total
    1-6-10|East|Jones|Pencil|95|1.99 |189.05
    1-23-10|Central|Kivell|Binder|50|19.99 |999.50...
    >>> pd.read_csv("SD.csv",dialect = dia,error_bad_lines=False)
    Skipping line 3: expected 7 fields, saw 10 # 所有不符合格式要求的列将直接忽略
    OrderDate Region Rep Item Units Unit Cost Total
    1-6-10 East Jones Pencil 95 1.99 189.05
    
    3)对文件进行分块处理并返回一个可迭代的对象。分块处理可以避免将所有的文件载入
    内存,仅在使用的时候读入所需内容。参数chunksize 设置分块的文件行数,10 表示每一块
    包含10 个记录。将参数iterator 设置为True 时,返回值为TextFileReader,它是一个可迭代对
    象。来看下面的例子,当chunksize=10、iterator=True 时,每次输出为包含10 个记录的块。
    >>> reader = pd.read_table("SampleData.csv",chunksize=10,iterator=True)
    >>> reader
    <pandas.io.parsers.TextFileReader object at 0x0314BE70>
    >>> iter(reader).next() # 将TextFileReader 转换为迭代器并调用next 方法
    OrderDate,Region,Rep,Item,Units,Unit Cost,Total # 每次读入10 行
    1-6-10,East,Jones,Pencil,95, 1.99 , 189.05
    1-23-10,Central,Kivell,Binder,50, 19.99 , 999.50
    2-9-10,Central,Jardine,Pencil,36, 4.99 , 179.64
    2-26-10,Central,Gill,Pen,27, 19.99 , 539.73
    3-15-10,West,Sorvino,Pencil,56, 2.99 , 167.44
    4-1-10,East,Jones,Binder,60, 4.99 , 299.40
    4-18-10,Central,Andrews,Pencil,75, 1.99 , 149.25
    5-5-10,Central,Jardine,Pencil,90, 4.99 , 449.10
    5-22-10,West,Thompson,Pencil,32, 1.99 , 63.68
    
    4)当文件格式相似的时候,支持多个文件合并处理。以下例子用于将3 个格式相同的
    文件进行合并处理。
    
    >>> filelst = os.listdir("test")
    >>> print filelst # 同时存在3 个格式相同的文件
    ['s1.csv', 's2.csv', 's3.csv']
    >>> os.chdir("test")
    >>> dfs =[pd.read_csv(f) for f in filelst]
    >>> total_df = pd.concat(dfs) # 将文件合并
    >>> total_df
    OrderDate Region Rep Item Units Unit Cost Total
    1-6-10 East Jones Pencil 95 1.99 189.05
    1-23-10 Central Kivell Binder 50 19.99 999.5
    
    
    '''
  • 相关阅读:
    composer阿里云短信服务不支持传参为数值--为2017年短信接口,2018阿里云有更新http://www.cnblogs.com/q1104460935/p/8916096.html
    随机生成字符串,数字,手机号,邮箱
    C#: .net序列化及反序列化 [XmlElement(“节点名称”)] [XmlAttribute(“节点属性”)] (上篇)
    自动升级功能
    C# WinForm 设置按纽为透明,使用背景色
    sql server 2000 单主键高效分页存储过程 (支持多字段排序)
    分页存储过程
    C# WinForm 解决子窗体放大后,子窗体图标放大的问题
    Windows 7/8 64位系统 不能注册32位dll 文件的解决方案
    添加ico图标
  • 原文地址:https://www.cnblogs.com/b-l-java/p/6896532.html
Copyright © 2011-2022 走看看