メモランダム!!

自分用の端書のため,他の人が読めるようには書いていません.悪しからずm(_ _)m

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

と出力される

↓参考
stackoverflow.com

2.書き込み編