はじめに
csv形式のファイルをpandasのread_csv()
で読み込んだ際にヘッダーがずれてしまうことがあったため、その対策例を紹介します
どんなことが起きるか(現象)
下記のようなcsvファイル(sample.csv)をread_csv()
で読み込んだ際にヘッダーがずれることがあります。
sample.csv は1行目はヘッダー、2行目以降はデータとなるようなcsvファイルです。
データの末尾に「,」(カンマ) が入ってしまっています。
path
hoge\hoge.txt,
sample.csvを下記のhoge.pyで読み込むと・・・
import pandas as pd
df = pd.read_csv('sample.csv')
print(df)
下記の出力結果となってしまいます。データの方にNaNが入ってしまってますね。
path
hoge\hoge.txt NaN
下記の出力結果となるのが理想です。
path
0 hoge\hoge.txt
なぜずれるか(原因)
上記の場合は、データの方にのみ末尾に不要な「,」(カンマ)が入ったことが原因です。
不要なセパレータが入り、ヘッダーとデータでセパレータの数が異なる場合にずれることがあると思われます。
(また、上記の場合はExcelで確認したのですが、ヘッダーが特にずれることなく、また末尾のカンマも消してくれるので問題ないように見えてしまいます。私はそれでハマりました・・・)
対策例
pythonで「sample.csv」を処理し、末尾の不要なセパレータを削除した「sample_out.csv」を出力する例を示します。
対策例1 (末尾の不要なセパレータを削除する)
末尾の改行を削除→末尾の,を削除→改行を追加 を行うことで末尾にある不要なセパレータを削除する方法です。
with open('sample.csv') as f:
lines = f.readlines()
lines=[x.rstrip() for x in lines]
lines=[x.rstrip(',') for x in lines]
lines=[x+'\n' for x in lines]
#ファイルに出力
with open('sample_out.csv', 'w') as fw:
fw.writelines(lines)
対策例2 (pandasのshift()を使用してヘッダーをずらす)
pandasには、データを行・列方向にずらすshift()
メソッドがあるのでそれを使う方法です。
df = pd.read_csv('sample.csv')
df.reset_index(inplace=True)
df = df.shift(axis=1)
df.drop('index', axis=1, inplace=True)
df.to_csv("sample_out.csv", index=False)
最終行でto_csv()
で出力していますが、dfをそのまま処理することが可能です。
動作環境
下記のバージョンで動作確認しました
- Python: 3.7.9
- pandas: 1.2.3
まとめ
csv形式のファイルをpandasのread_csv()
で読み込んだ際にヘッダーがずれてしまうことがあったため、pythonで動作する2種類の対策例を紹介しました。
リンク集
セパレータが特殊な場合でもヘッダーがずれることがあるみたいなので、下記もご参考に!