pandas
でcsvファイルを読み込むための関数read_csv()
について解説します。
read_csv()
は、引数で読み込みの細かい設定が可能です:
- 区切り文字の指定
index
やlabel
の行や列を指定する方法- 読み込む行・列の指定
などについて図解付きで解説していきます!
基本的な使用方法
read_csv()
を使用すると、csvデータからDataFrame
を作成できます。
引数で細かい設定をできますが、まずは基本的な読み込み方法を確認してみましょう。
read_csv():csvファイルを読み込む
次のcsvファイルを例に基本的な読み込み操作を解説します。
# a,b,c
# 1,20,2
# 2,30,3
# 3,10,1
read_csv()
にcsvファイルのパスを与えると、csvからDataFrame
を作成します。
import pandas as pd
df = pd.read_csv("read_csv_example.csv")
print(df)
# a b c
# 0 1 20 2
# 1 2 30 3
# 2 3 10 1
デフォルトでは、
- ヘッダーには、データの一行目が、
- インデックスには、自動で連番が
割り当てられます。
これを変更したい場合は、後述するheader
やindex_col
を使用します。
sep, delimiter:区切り文字の指定
デフォルトでは、データ間の区切り文字として,
(コンマ)が使用されます。
ちなみにですが、そもそもCSVは、Comma-Separated Valuesの略です。
区切り文字を変更したい場合には、sep
を明示的に指定します。
次のような/
で区切られたデータを考えてみます。
# a/b/c
# 1/20/2
# 2/30/3
# 3/10/1
sep = "/"
で、区切り文字を/
に変更して読み込んでみます。
df = pd.read_csv("read_csv_example_sep.csv", sep="/")
print(df)
# a b c
# 0 1 20 2
# 1 2 30 3
# 2 3 10 1
無事に、データを分割して読み込めました。
delimiter
はsep
のエイリアス(別名)です。
sep
の代わりにdelimiter
を使用しても全く同じ結果になります。
df = pd.read_csv("read_csv_example_sep.csv", delimiter="/")
print(df)
# a b c
# 0 1 20 2
# 1 2 30 3
# 2 3 10 1
ヘッダー・インデックスの指定
デフォルトでは、
- ヘッダーには、データの一行目が、
- インデックスには、自動で連番が
割り当てられます。
ヘッダー行やインデックス列を指定したい場合は、header
、index_col
を使用します。
header:ヘッダー(列名)の行を指定
デフォルトでは、データの1行目がヘッダーとして扱われて、label
名が設定されます。
header
を明示的に指定する場合:
header = int
⇒ ヘッダー行をint
で指定header = None
⇒ ヘッダー行なし(自動で連番を振る)
を指定することができます。
次のような、ヘッダー行が重複しているデータを例にします。
# Num_A,Num_B,Num_C
# a,b,c
# 1,20,2
# 2,30,3
# 3,10,1
header
を指定しない場合、2つめのヘッダー行がデータとして認識されてしまいます。
df = pd.read_csv("read_csv_example_header.csv")
print(df)
# Num_A Num_B Num_C
# 0 a b c
# 1 1 20 2
# 2 2 30 3
# 3 3 10 1
header
を指定して、1行目をヘッダーに設定してみます。
df = pd.read_csv("read_csv_example_header.csv", header = 1)
print(df)
# a b c
# 0 1 20 2
# 1 2 30 3
# 2 3 10 1
header
で指定した行より上は読み飛ばされる点に注意しましょう。
header=None
とすると、ヘッダー行はないものとして扱われ、自動で連番が振られます。
df = pd.read_csv("read_csv_example_header.csv", header = None)
print(df)
# 0 1 2
# 0 Num_A Num_B Num_C
# 1 a b c
# 2 1 20 2
# 3 2 30 3
# 4 3 10 1
names:列名を自分で設定
names
にlabel
名のリストなどを渡すことで、label
名を別途指定できます。
ヘッダー行がない場合には、names
でlabel
名を追加するだけでOKです。
# 1,20,2
# 2,30,3
# 3,10,1
label
名をnamse
で別途指定してみましょう。
df = pd.read_csv("read_csv_example_no_header.csv", names=["Apple", "Banana", "Carrot"])
print(df)
# Apple Banana Carrot
# 0 1 20 2
# 1 2 30 3
# 2 3 10 1
ヘッダー行がある場合には、header
を指定後、label
で上書きします。
# a,b,c
# 1,20,2
# 2,30,3
# 3,10,1
header
でヘッダーの行番号を指定、namse
でlabel
名を上書きしてみます。
df = pd.read_csv("read_csv_example.csv", header = 0, names=["Apple", "Banana", "Carrot"])
print(df)
# Apple Banana Carrot
# 0 1 20 2
# 1 2 30 3
# 2 3 10 1
ヘッダー行の指定を忘れると、csvファイルのヘッダーが不要なデータとして含まれてしまいます。
df = pd.read_csv("read_csv_example.csv", names=["Apple", "Banana", "Carrot"])
print(df)
# Apple Banana Carrot
# 0 a b c ←CSVのもともとのヘッダーがデータとして読まれてしまった
# 1 1 20 2
# 2 2 30 3
# 3 3 10 1
header
の指定を忘れないように注意しましょう!
index_col:インデックス列の指定
デフォルトでは、インデックスには連番が振られます。
index_col
を指定すると、指定した列をもとにindex
名が振られます。
index_col
は
- 列の番号
- 列のラベル名
のいずれかで指定します。
次のデータを例に、index_col
を指定してみます。
# Place,a,b,c
# Tokyo,1,20,2
# Osaka,2,30,3
# Chiba,3,10,1
"Place"
の列をインデックスに指定してみましょう。
# 列番号で指定
df = pd.read_csv("read_csv_example_index.csv", index_col=0)
print(df)
# a b c
# Place
# Tokyo 1 20 2
# Osaka 2 30 3
# Chiba 3 10 1
# ラベル名で指定
df = pd.read_csv("read_csv_example_index.csv", index_col="Place")
print(df)
# a b c
# Place
# Tokyo 1 20 2
# Osaka 2 30 3
# Chiba 3 10 1
列の番号、ラベル名どちらを使用しても、"Place"
の列をインデックスに指定できました。
読み込む行・列の指定
csvに不要なデータが含まれている場合には、
- 行をスキップ:
skiprows
,skip_footer
- 読み込む列を指定:
usecols
- コメント行のスキップ:
comment
することで、必要なデータのみを読み込むことができます。
skiprows:読み飛ばす行を指定
渡す引数によって、行の飛ばし方が異なります。
skiprows = int
:上部からint
行分読み飛ばすskiprows = [n, m, l, …]
:リストで指定した番号の行を読み飛ばす
以下のデータで、それぞれの実行例を確認していきます。
# a,b,c
# 1,20,2
# 2,30,3
# 3,10,1
# 4,50,2
# 5,40,1
まず、skiprows = int
で、データ上部からint
行分読み飛ばしてみます。
df = pd.read_csv("read_csv_example_skip.csv", skiprows=3, header=None)
print(df)
# 0 1 2
# 0 3 10 1
# 1 4 50 2
# 2 5 40 1
この例では、始めの3行を読み飛ばしています。
ヘッダー行も読み飛ばされてしまうため、header=None
を指定しました。
このように、ヘッダー行も読み飛ばされてしまう可能性がある点に注意しましょう。
次にskiprows = [n, m, l, …]
で、指定した複数の行を読み飛ばしてみます。
df = pd.read_csv("read_csv_example_skip.csv", skiprows=[1,3])
print(df)
# a b c
# 0 2 30 3
# 1 4 50 2
# 2 5 40 1
1行目と3行目を読み飛ばしていますね。
このようにskiprows
はintを与えるかリストを与えるかで挙動が異なるので注意しましょう!
skipfooter:下から数行を読み飛ばす
int
を指定して、データ下部から読み飛ばす行数を指定できます。
以下のデータで、実行例を確認してみます。
# a,b,c
# 1,20,2
# 2,30,3
# 3,10,1
# 4,50,2
# 5,40,1
下から2行分を読み飛ばしてみましょう。
df = pd.read_csv("read_csv_example_skip.csv", skipfooter=2)
print(df)
# a b c
# 0 2 30 3
# 1 4 50 2
# 2 5 40 1
下から2行分を読み飛ばすことができました。
usecols:読み込む列を指定
列番号のリストや、列名を与えて読み込む列を指定することができます。
usecol = [n, m,…]
⇒ 読み込む列番号をint
で指定usecol = ["label_1, label_2,…"]
⇒ 読み込む列名を文字列
で指定
# a,b,c,d
# 1,20,2,100
# 2,30,3,200
# 3,10,1,300
列番号、列名を指定する方法で、「a」と「c」の行のみを読み込んでみます。
# usecol = [n, m,…]:列番号をintで指定
df = pd.read_csv("read_csv_example.csv", usecols=[0, 2])
print(df)
# a c
# 0 1 2
# 1 2 3
# 2 3 1
# usecol = [label_1", "label_2",…] : 列名を文字列で指定
df = pd.read_csv("read_csv_example.csv", usecols=["a", "c"])
print(df)
# a c
# 0 1 2
# 1 2 3
# 2 3 1
列名、列番号をそれぞれ指定して、読み込む列を指定することができました。
ここで注意したいのが、
skiprows
:読み飛ばす行を指定usecols
:読み込む列を指定
という点に注意しましょう。
comment:コメント行をスキップ
csv内に特定の文字から始まるコメント行がある場合には、comment
を指定することで読み飛ばすことができます。
例えば、「*」から始まるコメント行があるcsvを考えてみます。
a,b,c
1,20,2
2,30,3
*comment line
3,10,1
*comment line2
この例の場合、comment="*"
とすると、「*」から始まる行を読み飛ばすことができます。
df = pd.read_csv("read_csv_example.csv", comment="*")
print(df)
# a b c
# 0 1 20 2
# 1 2 30 3
# 2 3 10 1
「*」から始まるコメント行を読み飛ばせました。
おわりに
pandas
で、csvファイルを読み込む関数read_csv()
を解説しました。
read_csv()
は引数で読み込みの細かい設定が可能:sep
,delimiter
:区切り文字の指定haeder
,index_col
:ヘッダー行やインデックス列の指定skiprows
,skipfooter
,usecols
:読み込む行・列の指定comment
:コメント行のスキップ
csvファイルではなく、excelファイルを読み込みたい場合は、read_excel()
を使用します。
こちらの記事を参照してください。
関数の使い方・使い分けは、手を動かしながら演習すると自然と身につきます!
実務でデータを取り扱っている方はそれを使用しながら、そうでない方はデータ分析の参考書を使用しながら勉強されるのがおススメです。
私の場合は、両方で勉強していましたが、参考書としては特に次のものがおススメでした。
【追記】この本のレビューも書いてみました↓↓!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!