使用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
0 1-6-10 East Jones
1 1-23-10 Central Kivell
2 2-9-10 Central Jardine
3 2-26-10 West Gill
4 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
0 1-6-10|East|Jones|Pencil|95|1.99 |189.05
1 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
0 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 行
0 1-6-10,East,Jones,Pencil,95, 1.99 , 189.05
1 1-23-10,Central,Kivell,Binder,50, 19.99 , 999.50
2 2-9-10,Central,Jardine,Pencil,36, 4.99 , 179.64
3 2-26-10,Central,Gill,Pen,27, 19.99 , 539.73
4 3-15-10,West,Sorvino,Pencil,56, 2.99 , 167.44
5 4-1-10,East,Jones,Binder,60, 4.99 , 299.40
6 4-18-10,Central,Andrews,Pencil,75, 1.99 , 149.25
7 5-5-10,Central,Jardine,Pencil,90, 4.99 , 449.10
8 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
0 1-6-10 East Jones Pencil 95 1.99 189.05
1 1-23-10 Central Kivell Binder 50 19.99 999.5


'''

         


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM