Pandasで値を取り出そうとすると余計な情報が入ってきて邪魔で困る!

…とお困りの方のために、この記事で対処方法をまとめました。

 

どうもこんにちは、20代怠け者(@20sInvest)です!

Python3でCSVのデータを扱うためにPandasを使っていたのですが、データを抽出して出力しようとすると、値だけではなく余計なデータも入ってしまってしまう現象で少々悩んでました。

例えば、とあるセルの数値のデータを抽出して、Printで出力するとこんな感じになります。

なぜか、列の名前と、変数の型のデータまで一緒に付いてきます。

5    31.1
Name: Price, dtype: float64

 

変数の型とか、余計な情報はいらんのじゃ!
ほしいのは数値だけなんだよ!

…ということで指定したデータ、値を取り出す方法を探していたのですが、どうしても検索で見つからなかったので、なんとか見つけた対処方法を備忘録としてシェアをしておきます。

ご参考までにどうぞ。

 

  Pandasの基本的な知識やインストール方法は、他にも詳しい解説記事があるのでここでは省きます。

あくまで、抽出したデータの値を取り出す方法について、この記事ではまとめました。

  今回使ったPythonおよびPandasのバージョンは以下の通りです。

  • Python: 3.8.1
  • Pandas: 1.0.4

【問題】Pandasで抽出したデータは「Series型」で返される

さて、抽出したデータをそのままPrintで出力すると以下のような形に出力されてしまうわけですが、これはデータが数値(値)ではなく、Series型という変数型で返されてくることが理由です。

 

Series型とは、Pandasが出力したデータ格納用のオリジナルの変数型です。

dtypeはfloat64…つまりデータ自体は数値の型になっているんですが、今見ているものは実際にはSeries型であり、その中に更に31.1という数値が入ってるよ、ということになっているようです。

下記は、Pandasで抽出してきたデータがSeries型で返ってきた場合のサンプルです。

#「Price列」の「index」行目のデータを取得
price = data['Price'][index]

print(price)
print(type(price))


#5    31.1
#Name: Price, dtype: float64
#<class 'pandas.core.series.Series'>

 

Series型のままデータを扱おうとすると、出力の度に上記のような複雑&余計なデータが付いてくるので、けっこうな困りものです。

なんとかこのSeries型から値だけを取り出したい!

…というのが、この記事での目的ですね。

 

ちなみにSeries型とはPandasが出力する「1列だけのデータ」のことで、

「2列以上のデータ」の場合はDataframe型という変数型で返ってきます。

例えば、CSV全体を読み込んだ場合は、Dataframe型で返ってきて、ある列だけを読み込んだ場合はSeries型で返ってくる、といった具合ですね。

【コード】Series型から値だけを取り出す記述

ということで、このややこしいSeries型から、中身の値だけを取り出す記述は以下のとおりです。

#Series型で出力される結果の、値の部分だけを取り出す
price_val = price.iloc[-1]

print(price_val)
print(type(price_val))


#31.1
#<class 'numpy.float64'>

 

ilocを使うとデータの中から特定の値だけを取り出すことができるので、これを使って「Series型の末尾のデータだけを取り出す」という操作をしているのがこの記述です。

これで出力すると、データの値だけが取り出せます。

タイプも確認してみると、float64型になってるのがわかりますね。

 

【仕様?】一度Series型で変数に入れないと、ilocは使えない

Pandasの仕様なのか、それともぼくの記述がおかしかったのかはわかりませんが、

抽出したデータは一旦Series型で変数に入れてから、その後ilocで値の部分を取り出さないとエラーになってしまうようです。

値を取り出したいだけなのに、Series型を一旦入れるためだけの変数も用意してやるのはちょっと面倒ですが、

  1. Pandasでデータを抽出
  2. 抽出したデータを変数に入れる
  3. データから値だけを取り出す

という順番が必要みたいです。

一連の流れをまとめると、以下のとおりですね。

#「Price列」の「index」行目のデータを取得
price = data['Price'][index]


#Series型で出力される結果の、値の部分だけを取り出す
price_val = price.iloc[-1]

print(price_val)
print(type(price_val))

まとめ

ということで、この記事をまとめると以下のとおりです。

  • Pandasでデータを抽出するとSeries型で返される
  • Series型のままだと余計な情報が入ってくるので使いづらい
  • ilocで、Series型の中の「値」だけを取り出せる
  • 面倒だけど、一旦Series型のデータを変数に入れてやる必要あり

 

いやしかし、Pandasは結構クセがありますね!

データを抽出する方法によって、値そのままで返ってきたり、Series型だったり、Dataframe型だったり、色んなパターンがあるのがややこしい理由な気がします。

値を取り出すだけでこんなに苦労するとは思いませんでしたよ…。

 

これらのメモが、皆さんの参考になれば幸いです。

もし「もっといい方法あるよ」という方いらっしゃったら、ぜひ教えてください!

ということで以上、ご参考までに!

それでは!