概要

pandasのread_csvでファイルを読み込む。

@CretedDate 2014/09/25
@Versions Python2.7.6 pandas0.14.1-2

csvの読み込み

csv読み込み。

そのままread_csvすると1行目をheaderとして認識する。ヘッダがない場合はheader=Noneとしておけば良い。

下記のようなファイルを読み込んでみる。

10,8,3
12,1,5
5,3,3
import pandas as pd
pd.read_csv("foo.csv", header=None)
   10  8  3
0  12  1  5
1   5  3  3

試してみたところ、header=-1とかheader=Falseでも同じ挙動になった。

headerに名前を付ける場合は、namesを使用。

pd.read_csv( 'foo.txt', names=('a', 'b', 'c') )
    a  b  c
0  10  8  3
1  12  1  5
2   5  3  3

ヘッダ行があれば特に何も指定せずに読み込める。

下記のようなファイルを読み込んでみる。

col1,col2,col3
10,8,3
12,1,5
5,3,3
pd.read_csv( 'foo.txt' )
   col1  col2  col3
0    10     8     3
1    12     1     5
2     5     3     3

1列目をindexにしてみる。

下記のデータを読み込む。

col1,col2,col3
a,8,3
b,1,5
c,3,3
pd.read_csv( 'foo.txt', index_col='col1' )
      col2  col3
col1            
a        8     3
b        1     5
c        3     3

dtypeを指定する。

そのままだと自動判定

data = pd.read_csv( 'foo.txt'  )
data['col1'].dtype
  #=> dtype('O')
data['col3'].dtype
  #=> dtype('int64')
data = pd.read_csv( 'foo.txt', dtype={'col1':'S10', 'col2':'f8', 'col3':'f8'}  )
data['col1'].dtype
  #=> dtype('O')
data['col3'].dtype
  #=> dtype('float64'

欠損値がある場合、そのまま読むと数値はnanになる。

col1,col2,col3  
a,8,3
b,1,
c,,3 
pd.read_csv( 'foo.txt' )
  col1  col2  col3
0    a     8     3
1    b     1   NaN
2    c   NaN     3

0埋めしたい場合はどうするんだろう。とりあえずこれでいいか。

pd.read_csv( 'foo.txt' ).fillna(0)

tsvの読み込み

tsvの場合はdelimiterでタブを指定。

pd.read_csv( 'foo.txt', delimiter='\t' )

delim_whitespaceを指定するとspaceとかtabをdelimiterとして扱う。

pd.read_csv( 'foo.txt', delim_whitespace=True )

csv/tsvの出力

to_csvで出力可能。

data = pd.read_csv( 'foo.txt' )
data.to_csv()
  #=> ',col1,col2,col3\n0,a,8,3\n1,b,1,5\n2,c,2,3\n'

ファイル出力

data.to_csv( 'bar.csv' )

結果

,col1,col2,col3
0,a,8,3
1,b,1,5
2,c,2,3

元のファイルにindexが付いた状態で出力されている。読み込む時はindex_colを指定しないとさらにindexが付加されることに。

pd.read_csv( 'bar.csv', index_col=0 )

indexを出力対象から外したい場合はindex=Falseを指定。

data.to_csv( 'bar.csv', index=False )

tsv出力

data.to_csv( 'bar.csv', sep='\t' )

全部quoteで囲む場合。

import csv
data.to_csv( 'bar.csv', quoting=csv.QUOTE_ALL )