Pandas CSVファイルからの読み込み

データがCSV(カンマ区切り以外も可)ファイルで与えられているケースはよくあると思います。また解説のためのデータが、プログラム内でデータがセットされてもイメージしづらいかと思いますので、基本的にここで紹介したロジックをベースに他の例も示します。

CSVファイルからの読み込み

イメージし易いようにExcelシート上で展開したデータが以下です。

画像に alt 属性が指定されていません。ファイル名: image.png

実際のデータは以下です。CSVと言いながら見やすさを優先して区切り文字をタブにしています。

サンプルデータ

高山	健吾	福島県	33	男
遠藤	誠子	埼玉県	21	女
内田	たまき	石川県	25	女
吉井	興起	栃木県	47	男

各カラムのヘッダは左から順に、姓、名、出身地、年齢、性別のデータになっています。

サンプルコード

CSVをPandasで読み込み、画面に出力しています。実際にはタブ区切りなので区切り文字をタブに指定し、ヘッダは外部から与えて、読み込み時の各列の型の指定をしています。

import pandas as pd

input_file_name = "sample.csv"
header = ["姓", "名", "出身地", "年齢", "性別",]
data_type = {"姓": str, "名": str, "出身地": str, "年齢": int, "性別": str}
df = pd.read_csv(input_file_name, sep='\t', header=None, names=header, dtype=data_type)

print(df)

実行例

(LearningPython) MacBookPro:Pandas $ python 01.read_csv.py
    姓    名  出身地  年齢 性別
0  高山   健吾  福島県  33  男
1  遠藤   誠子  埼玉県  21  女
2  内田  たまき  石川県  25  女
3  吉井   興起  栃木県  47  男
(LearningPython) MacBookPro:Pandas $

解説

pd.read_csv()

このサンプルにおいては、pd.read_csv()がことの全てですね。

第1引数: input_file_name

まず1つ目の引数はファイル名です。これだけでもCSVファイルを指定さえすれば動作します。

第2引数: sep=”\t”

今回はカンマ区切りではなくタブ区切りにしているので、sepでタブを指定しています。指定を省略するとカンマになっています。なお覚える理由もありませんが、TSV(タブ区切り)ファイル向けにread_table()という関数も用意されています。

第3引数: header=None

header=Noneを指定しないと、ファイルの1行目が代わりにカラム名として使用されます。今回はいきなりデータが始まっているので指定しています。

データの1行目をカラム名として用いたい場合には、header=0と指定しますが、これがデフォルト値なので指定しなくても同じ動作になります。header=1とした場合には2行目が用いられ、1行目は無視されます。

import pandas as pd

input_file_name = "sample.csv"
header = ["姓", "名", "出身地", "年齢", "性別", ]
data_type = {"姓": str, "名": str, "出身地": str, "年齢": int, "性別": str}

# df = pd.read_csv(input_file_name, sep='\t', header=None, names=header, dtype=data_type)
df = pd.read_csv(input_file_name, sep='\t', header=1)

print(df)
(LearningPython) MacBookPro:Pandas $ python 03.read_csv.py
   遠藤   誠子  埼玉県  21  女
0  内田  たまき  石川県  25  女
1  吉井   興起  栃木県  47  男
(LearningPython) MacBookPro:Pandas $
第4引数: names=header

カラム名がファイル内で提供されないのでListで指定しています。指定しなかった場合には、数値が0から順にあてがわれます。これは行名が0から順にあてがわれているのと同じです。

import pandas as pd

input_file_name = "sample.csv"
header = ["姓", "名", "出身地", "年齢", "性別", ]
data_type = {"姓": str, "名": str, "出身地": str, "年齢": int, "性別": str}

# df = pd.read_csv(input_file_name, sep='\t', header=None, names=header, dtype=data_type)
df = pd.read_csv(input_file_name, sep='\t', header=None)

print(df)
(LearningPython) MacBookPro:Pandas $ python 02.read_csv.py
    0    1    2   3  4
0  高山   健吾  福島県  33  男
1  遠藤   誠子  埼玉県  21  女
2  内田  たまき  石川県  25  女
3  吉井   興起  栃木県  47  男
(LearningPython) MacBookPro:Pandas $
第5引数: dtype=data_type

最後にカラムのデータ型の指定です。何の指定もしなくても、勝手に判定して読み込ませることは可能です。ですが、電話番号を読み込ませると頭の”0″が欠落するといった、Excelでもありがちな問題に遭遇します。基本的には型を指定することをおすすめします。

指定するのは辞書で、キーは第4引数で指定したカラム名です。全てを指定する必要は無く、電話番号のカラムだけstrにし残りは自動判定指せるべく{"tel": str}のみといった指定も可能です。

返値

返却されるのはDataFrameという形式のデータです。

print(df)

続いてprint文です。ここではDataFrame自体を引数にしています。

自動的に文字列にして表示されますが、列や行の数が多くなると適当に省略された状態で表示されます。

備考

行名、列名については、別途解説します。