1. 程式人生 > >python pandas IO tools 之read_csv檔案讀寫引數詳解

python pandas IO tools 之read_csv檔案讀寫引數詳解

python pandas IO tools 之csv檔案讀寫

讀取csv檔案:pd.read_csv(),寫入csv檔案:pd.to_csv()
pandas還可以讀取一下檔案:
read_csv,
read_excel,
read_hdf,
read_sql,
read_json,
read_msgpack (experimental),
read_html,
read_gbq (experimental),
read_stata,
read_sas,
read_clipboard,
read_pickle;
相應的寫入:
to_csv,
to_excel,
to_hdf,
to_sql,
to_json,
to_msgpack (experimental),
to_html,
to_gbq (experimental),
to_stata,
to_clipboard,
to_pickle.

常用引數的讀取csv檔案

import pandas as pd
obj=pd.read_csv('f:/ceshi.csv')
print obj
print type(obj)
print obj.dtypes
  Unnamed: 0  c1  c2  c3
0          a   0   5  10
1          b   1   6  11
2          c   2   7  12
3          d   3   8  13
4          e   4   9  14
<class 'pandas.core.frame.DataFrame'>
Unnamed: 0    object
c1             int64
c2             int64
c3             int64
dtype: object

ceshi.csv為有列索引沒有行索引的資料,read_csv會自動加上行索引,即使原資料集有行索引。
read_csv讀取的資料型別為Dataframe,obj.dtypes可以檢視每列的資料型別

obj_2=pd.read_csv('f:/ceshi.csv',header=None,names=range(2,5))
print obj_2
    2   3   4
0  c1  c2  c3
1   0   5  10
2   1   6  11
3   2   7  12
4   3   8  13
5   4   9  14

header=None時,即指明原始檔案資料沒有列索引,這樣read_csv為自動加上列索引,除非你給定列索引的名字。

obj_2=pd.read_csv('f:/ceshi.csv',header=0,names=range(2,5))
print obj_2
   2  3   4
0  0  5  10
1  1  6  11
2  2  7  12
3  3  8  13
4  4  9  14

header=0,表示檔案第0行(即第一行,python,索引從0開始)為列索引,這樣加names會替換原來的列索引。

obj_2=pd.read_csv('f:/ceshi.csv',index_col=0)
print obj_2
   c1  c2  c3
a   0   5  10
b   1   6  11
c   2   7  12
d   3   8  13
e   4   9  14
obj_2=pd.read_csv('f:/ceshi.csv',index_col=[0,2])
print obj_2
      c1  c3
  c2        
a 5    0  10
b 6    1  11
c 7    2  12
d 8    3  13
e 9    4  14

index_col為指定資料中那一列作為Dataframe的行索引,也可以可指定多列,形成層次索引,預設為None,即不指定行索引,這樣系統會自動加上行索引(0-)

obj_2=pd.read_csv('f:/ceshi.csv',index_col=0,usecols=[0,1,2,3])
print obj_2
   c1  c2  c3
a   0   5  10
b   1   6  11
c   2   7  12
d   3   8  13
e   4   9  14
obj_2=pd.read_csv('f:/ceshi.csv',index_col=0,usecols=[1,2,3])
print obj_2
    c2  c3
c1        
0    5  10
1    6  11
2    7  12
3    8  13
4    9  14

usecols:可以指定原資料集中,所使用的列。在本例中,共有4列,當usecols=[0,1,2,3]時,即選中所有列,之後令第一列為行索引,當usecols=[1,2,3]時,即從第二列開始,之後令原始資料集的第二列為行索引。

obj_2=pd.read_csv('f:/ceshi.csv',index_col=0,nrows=3)
print obj_2
   c1  c2  c3
a   0   5  10
b   1   6  11
c   2   7  12

nrows:可以給出從原始資料集中的所讀取的行數,目前只能從第一行開始到nrows行。

datetime handing 資料中日期處理

obj_3=pd.read_csv('f:/ceshi_date.csv',index_col=0,)
print obj_3
print type(obj_3.index)
                   A  B  C
date                      
20090101           a  2  3
20090102           b  3  4
20090103           c  4  5
<class 'pandas.indexes.numeric.Int64Index'>
obj_3=pd.read_csv('f:/ceshi_date.csv',index_col=0,parse_dates=True)
print obj_3
print type(obj_3.index)
                   A  B  C
date                      
2009-01-01         a  2  3
2009-01-02         b  3  4
2009-01-03         c  4  5
<class 'pandas.tseries.index.DatetimeIndex'>

parse_dates=True:可令字串解析成時間格式。

data='date,value,cat\n1/6/2000,5,a\n2/6/2000,10,b\n3/6/2000,15,c'
print data
date,value,cat
1/6/2000,5,a
2/6/2000,10,b
3/6/2000,15,c
from StringIO import StringIO
print pd.read_csv(StringIO(data),parse_dates=[0],index_col=0)
            value cat
date                 
2000-01-06      5   a
2000-02-06     10   b
2000-03-06     15   c
print pd.read_csv(StringIO(data),parse_dates=[0],index_col=0,dayfirst=True)
            value cat
date                 
2000-06-01      5   a
2000-06-02     10   b
2000-06-03     15   c

US常用時間格式:MM/DD/YYYY,dayfirst=True:可將其改為DD/MM/YYYY

分隔符和閾值

tem='id|level|category\npatient1|123,000|x\npatient2|23,000|y\npatient3|1,234,018|z'
print tem
id|level|category
patient1|123,000|x
patient2|23,000|y
patient3|1,234,018|z
print pd.read_csv(StringIO(tem),sep='|')
         id      level category
0  patient1    123,000        x
1  patient2     23,000        y
2  patient3  1,234,018        z
print pd.read_csv(StringIO(tem),sep='|',thousands=',')
         id    level category
0  patient1   123000        x
1  patient2    23000        y
2  patient3  1234018        z