事の発端
事件は Python の pandas で、 以下の様にCSV書き込み→読み込み をシンプルに行った時に起こった。
import pandas as pd
# 変数data を定義してCSVファイルに書き込む
data = pd.DataFrame({'name': ['太郎', '花子', '二郎', '由紀'],
'数学': [80, 15, 90, 50],
'英語': [80, 70, 50, 65],
'国語': [ 90, 60, 60, 60]})
print(data)
data.to_csv('a.csv')
# 書き出したCSV ファイルを読みだして出力
data = pd.read_csv('a.csv')
print(data)
上記を実行した際に、それぞれに出力に差分が生じた。
# 1回目の出力結果
name 数学 英語 国語
0 太郎 80 80 90
1 花子 15 70 60
2 二郎 90 50 60
3 由紀 50 65 60
# 2回目の出力結果
Unnamed: 0 name 数学 英語 国語
0 0 太郎 80 80 90
1 1 花子 15 70 60
2 2 二郎 90 50 60
3 3 由紀 50 65 60
Unnamed: 0
という謎カラムが追加されてしまった。これを解消する。
何が起きているのか?
上記書き込みにおいて、以下のCSVファイルが出力されていた。
,name,数学,英語,国語
0,太郎,80,80,90
1,花子,15,70,60
2,二郎,90,50,60
3,由紀,50,65,60
1行目のname の左に想定外の ,
が追加されてしまっている。
これによって、最初のカラムが無記名とみなされている模様。
対処法
以下のどちらかで対応可能。両方やる必要はない。
to_csv で対応
以下の様にindex をfalse で指定することで解消できる。
data.to_csv('a.csv', index=False)
上記により、以下のCSVファイルを出力することができた。
name,数学,英語,国語
太郎,80,80,90
花子,15,70,60
二郎,90,50,60
由紀,50,65,60
# 書き出したCSV ファイルを読みだして出力
data = pd.read_csv('a.csv')
print(data)
# 出力結果
name 数学 英語 国語
0 太郎 80 80 90
1 花子 15 70 60
2 二郎 90 50 60
3 由紀 50 65 60
read_csv
以下の様にインデックスカラムを指定する。
data = pd.read_csv('a.csv', index_col=0)
print(data)
# 出力結果
name 数学 英語 国語
0 太郎 80 80 90
1 花子 15 70 60
2 二郎 90 50 60
3 由紀 50 65 60