Python3:CSVファイルの入出力について色々
Pandasを用いたCSVファイルの入出力について色々試してみました.下の英語ドキュメントに詳しく書いてあるんですが,自分がよく使うものだけピックアップしてメモしておきます.
テスト用にこんなCSVファイルを用意します
text1.csv ↓
hakata@hukuoka+900,100,1981 kitakyuushuu@hukuoka+900,200,1954 iiduka@hukuoka+900,300,1971
もくじ
1.読み込み編
ⅰ.普通に読み込んだ場合は一行目がheaderになる
とくに何も引数を指定しない場合は,一行目がheaderになるようです
In [1]: import pandas as pd df = pd.read_csv('text1.csv') # データフレームを作る In [2]: df Out[2]: hakata@hukuoka+900 100 1981 0 kitakyuushuu@hukuoka+900 200 1954 1 iiduka@hukuoka+900 300 1971
ⅱ.headerを無しを指定すると適当な数が埋め込まれる
引数に,header=Noneを指定すればいけます.
In [3]: df = pd.read_csv('text1.csv',header=None) In [4]: df Out[4]: 0 1 2 0 hakata@hukuoka+900 100 1981 1 kitakyuushuu@hukuoka+900 200 1954 2 iiduka@hukuoka+900 300 1971
ⅲ.headerやindexに名前をつけたい場合namesなどを使う
In [5]: df = pd.read_csv('text1.csv' ,names=('c1','c2','c3')) In [6]: df Out[6]: c1 c2 c3 0 hakata@hukuoka+900 100 1981 1 kitakyuushuu@hukuoka+900 200 1954 2 iiduka@hukuoka+900 300 1971
ⅳ.カンマ以外で区切りたいとき
たとえば"@"区切る場合はsepを使う
In [7]: df = pd.read_csv('text1.csv', header=None,sep='@') In [8]: df Out[8]: 0 1 0 hakata hukuoka+900,100,1981 1 kitakyuushuu hukuoka+900,200,1954 2 iiduka hukuoka+900,300,1971
"@"でも"+"でもカンマでも区切りたい場合はsep='[@+,]'みたいに書く
In [9]: df = pd.read_csv('text1.csv', header=None,sep='[@+,]') In [10]: df Out[10]: 0 1 2 3 4 0 hakata hukuoka 900 100 1981 1 kitakyuushuu hukuoka 900 200 1954 2 iiduka hukuoka 900 300 1971
ⅴ.特定の列をindexにしたいとき
index_col=[指定したい行]で指定するそうです.
In [11]: df = pd.read_csv('text1.csv', index_col=[0]) In [12]: df Out[12]: 100 1981 hakata@hukuoka+900 kitakyuushuu@hukuoka+900 200 1954 iiduka@hukuoka+900 300 1971
ⅵ.convertersを用いて特定の列だけ置き換える
import pandas as pd # 置き換え def sub(x): y = x.replace('@', '').replace('+900', ' ') return (y) # convertersに渡す conv = { 0: sub, # データフレーム0列目に対してsub関数を呼び出す 1: sub, # データフレーム1列目に対してsub関数を呼び出す } # データ読み込み df = pd.read_csv('testCSV1.csv', header=None,converters=conv) # 出力 print(df)
と書くと
0 1 2 0 hakatahukuoka 100 1981 1 kitakyuushuuhukuoka 200 1954 2 iidukahukuoka 300 1971
と出力される