Pandas groupby で任意のデータだけを区分けする

Excelやcsvのデータ処理をすると、『この条件で図を描きたい』と思う時があります。例えば、irisデータだと品目を区分けしてグラフを描く。みたいな。

それには、groupby()という関数が便利です。

ということで、さっそくirisデータの品目を区分けしてみましょう。

irisデータの取得はこちらの過去記事で。


groupbyを使ってみよう

図を描くために必要なライブラリーをインポートしておきます。

import pansas as pd
import matplotlib.pyplot as plt
%matplotlib inline

これに、プラスして綺麗な図を描けると有名なggplotも入れておきましょう。

plt.style.use("ggplot")
df = pd.read_csv("./iris.csv")
df.head()

一度、irisの情報をみておきました。


では、品目ごとに絞っていきましょう。

”"species"”で絞りたい場合、以下のコードで絞りましょう。

groups = df.groupby("species")

こちらでしぼりました。

グループの内訳をみる

.groupsでグループの内訳をみることができます。

groups.groups

実行結果:

{'setosa': Int64Index([ 0,  1,  2,  3, ・・・49],dtype='int64'),
'versicolor': Int64Index([50, 51, 52, 53,・・・99],dtype='int64'),
'virginica': Int64Index([100, 101, 102,・・・ 149], dtype='int64')}

とにかく、speciesで分かれたことは分かりました。


区分けした意中の要素をみる

speciesで分けたので、この中の1つ、setosaだけを見たい場合は

g1 = groups.get_group("setosa")
g1

実行結果:

画像1

setosaで絞った品目の結果だけが見られます。


複数を見たい場合

irisではテキストデータの列がspeciesしかありませんが、一応、他の列も複数絞ることも可能です。

groups = df1.groupby(["species","sepal_length"])

実行結果:

{('setosa', 4.3): Int64Index([13], dtype='int64'),
('setosa', 4.4): Int64Index([8, 38, 42], dtype='int64'),・・・
('virginica', 7.7): Int64Index([117, 118, 122, 135], dtype='int64'),
('virginica', 7.9): Int64Index([131], dtype='int64')}

で詳細をみることができます(あんまり参考になりませんが・・)。


特定のデータの平均をみることも可能

g1 = groups.get_group("setosa")
g1

g1.mean()

実行結果:

sepal_length    5.006
sepal_width     3.418
petal_length    1.464
petal_width     0.244
dtype: float64



groupで区切ったものは、nameとgroupを吐き出すことが可能。

nameは何を吐き出すかと言いますと・・

for name, group in groups:
   print(name)
   #print(group)

実行結果:

setosa
versicolor
virginica

区切った内容です。

では、groupはと言いますと・・

for name, group in groups:
   #print(name)
   print(group)

実行結果:

画像2

データの中身を全て格納しています。


グラフを描いてみます

これらを使ってグラフを書きたい場合、

groups = df1.groupby("species")
for name, group in groups:
   plt.scatter(group["sepal_length"], group["sepal_width"],label=name)
plt.legend()

でグラフを描くことが可能です。


この記事が気に入ったらサポートをしてみませんか?