YutaKa Notebook | Enjoy Python!

Python の文法やモジュール、Python関連のAPIについて画像・ソースコード付きで徹底解説!

pandas | read_csv() 細かい設定も「図解」しました!

pandasでcsvファイルを読み込むための関数read_csv()について解説します。

read_csv()は、引数で読み込みの細かい設定が可能です:

  • 区切り文字の指定
  • indexlabelの行や列を指定する方法
  • 読み込む行・列の指定

などについて図解付きで解説していきます!

 

基本的な使用方法

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

デフォルトでは、

  • ヘッダーには、データの一行目が、
  • インデックスには、自動で連番が

割り当てられます。

これを変更したい場合は、後述するheaderindex_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

無事に、データを分割して読み込めました。

delimitersepのエイリアス(別名)です。

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

ヘッダー・インデックスの指定

デフォルトでは、

  • ヘッダーには、データの一行目が、
  • インデックスには、自動で連番が

割り当てられます。

ヘッダー行やインデックス列を指定したい場合は、headerindex_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:列名を自分で設定

nameslabel名のリストなどを渡すことで、label名を別途指定できます。

ヘッダー行がない場合には、nameslabel名を追加するだけで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でヘッダーの行番号を指定、namselabel名を上書きしてみます。

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()を使用します。

こちらの記事を参照してください。

関数の使い方・使い分けは、手を動かしながら演習すると自然と身につきます

実務でデータを取り扱っている方はそれを使用しながら、そうでない方はデータ分析の参考書を使用しながら勉強されるのがおススメです。

私の場合は、両方で勉強していましたが、参考書としては特に次のものがおススメでした。

Python実践データ分析100本ノック

Python実践データ分析100本ノック

 

【追記】この本のレビューも書いてみました↓↓!

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!