1
0

データフレームのデータスライス時に発生するエラー

Posted at

本記事は個人用のメモ書きである。
あくまで、似たようなエラーで引っかかってしまった初学者の方向けの記事になるので、一般的な内容を期待されている方は回れ右をしていただきたい。

事象

今回の発生したエラーは、とある記事通りにコードを実装していた際に発生した次のエラーである。

single_image = pixel_values[1,:].reshape(28, 28)

InvalidIndexError: (1, slice(None, None, None))

このコードでやりたかった処理としては、pixel_valuesというリスト(画像がいっぱい格納されている三次元のイメージ)から、一つ目の画像を引っ張ってこようと1行目のレコードをスライスしようとした形である。
しかし、この初めて見るエラーが出てきたため、面食らってしまった。

原因

こんなことを言うのは「お前いくらなんでもいい加減すぎるだろう」と馬鹿にされそうで憚れるのだが、結論原因はデータ理解の不足である。
pixel_valuesをリスト(或いはnumpy系のやつかな~)という認識でいたのだが、実はこのデータはpandasのデータフレームであった。

「まさかデータの種類も知らずにデータスライスするやつがいるとは。。。」と呆れている人もいるだろうが、現にここにいるのである。
データフレームを直接スライスはできないので、ちゃんとpandasの仕様に合わせたスライスの仕方をすることが解決策となる。

解決策

single_image = pixel_values.iloc[1,:].values.reshape(28, 28)

ここまで書けばもう充分かもしれないが、念のため解決策となるコードも上に記載しておく。
ポイントはilocを使用したデータスライスである。

また、このスライスで取得できるのはデータシリーズのため、直接reshapeができないので、間にしれっとvaluesを挟んでいる。

総括

自分が扱っているデータがどの種類でどんな形で保持されているのか理解する。
当たり前だけど、これを怠らないことが大事である。
(本記事が該当エラーで困惑してしまった人の助けに少しでもなれば幸いである。)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0