はじめに
csv形式で取得したファイルをpandasで取り込んで処理しようとしたところ、ヘッダーとデータがずれてしまったのですが意外と答えにすぐたどり着けなかったので記事にしました。
解決法へジャンプ
動作環境
以下の環境で実行しました。
モジュール | version |
---|---|
python | 3.8.3 |
pandas | 1.0.5 |
問題
次のようなcsv形式ファイルをDatFrameとして取り込みます。
example.csv
Time x y z
0 1 2 10
1 2 2 10
2 3 2 10
..
read_csv()
を使って取り込みます。
read_csv.py
import pandas as pd
path = 'csvファイルのパス'
df = pd.read_csv(path)
print(df)
ターミナルでの出力結果は次のようになりました。
# Time\tx\ty\tz
# 0 1\t1\t2\t10
# 1 2\t2\t2\t10
# 2 3\t3\t2\t10
..
余計な\t
が入ってしまっています。カンマ区切りではなくタブ区切り(tsv形式)だったようです。
read_tabel()で実行してみます。
read_tsv.py
import pandas as pd
path = 'csvファイルのパス'
df = pd.read_table(path)
print(df)
次のような出力結果になりました。
\t
は無くなりましたが、代わりにヘッダーとデータがずれてしまい、zのデータがすべてNaNになってしまいました。
# Time x y z
# 0 1 2 10 NaN
# 1 2 2 10 NaN
# 2 3 2 10 NaN
解決法
次のようにread_csv()
に引数を与えます。
read_csv_2.py
import pandas as pd
path = 'csvファイルのパス'
df = pd.read_csv(path, sep='\s+')
print(df)
padasのドキュメントによると、1文字以上の文字によって区切られたファイルに対して与える引数のようです。
もともとのデータがタブとスペース区切りになっているのが原因だったようです…。勘弁してよ…笑。
まとめ
タブとスペースによって区切られていたデータをcsv_read()
に引数sep='\s+'
を与えて、ヘッダーとデータを正しくDataFrameに変換できました。