こんにちはミナピピン(@python_mllover)です。
仕事でPythonを触っていたのですが、クライアントからもらったcsvをpandasで読み込むと列がズレて先頭列のデータが勝手にインデックスになるという謎の現象が起こりました。index_col=0などを指定しても解決せず、少しハマりましたが原因が分かれば大したことはない話でした。
csvを読み込むとインデックスと列がズレる原因
最初はタブ区切りとカンマ区切りの違いかとも思ったのですが、結果からいくと、原因はcsvの端に欠損値の列が含まれていたことでした。
つまり内部的には、列名はN個だったのに対して、データは欠損値の列を含めてN+1個存在しており、それが原因で一番左端の列のデータが強制的にインデックスに押し込まれる形になってしまっていたわけですね。気が付けば単純な話なのですがエクセル上でファイルの中身を確認してもエクセルは欠損値はNaNではなく空欄で表示するので、列名と列データの数がズレていることにすぐには気づけませんでした。
csvを作成した人に問い合わせると、pythonのcsvもモジュールで処理したデータをcsvに整形したみたいですが、整形特に以下のようなコードを書いていました。
csv.write(列1のデータ+','+列2のデータ+','+列3のデータ+','+'\n')
不要なのは「列3のデータ」の後ろにある「,」で、これがあると列3の横に欠損値の空白列が作成されてしまうため、作成したcsvをPythonで読み込むと列がズレて左端のデータがインデックスに押し込まれるという現象が起こってしまうわけですね。
なので解決法としてはcsvをメモ帳なんかのテキストエディタで開いて各行の後ろにある,を取り除くか、エクセルで1行目の列部分にセルを1つ挿入して、空白列用の列を新しく作ってあげることです。そうすると列数とカラム数が一致するので、pandasが勝手にインデックスに1行目のデータを押し込む、みたいな現象は起こらなくなります。
エクセルの取り扱いもたまにハマることがあるので油断できません。では~
関連記事:https://zetaseya.work/python%E3%80%81pandas%E3%81%AEcsv%E3%83%87%E3%83%BC%E3%82%BF%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A7%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%81%AE%E5%88%97%E3%81%8C%E3%81%9A%E3%82%8C%E3%81%A6/
コメント
[…] 関連記事:pandasでcsv読み込み時にインデックスや列がズレる原因と対処法 […]