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
実行結果:
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)
実行結果:
データの中身を全て格納しています。
グラフを描いてみます
これらを使ってグラフを書きたい場合、
groups = df1.groupby("species")
for name, group in groups:
plt.scatter(group["sepal_length"], group["sepal_width"],label=name)
plt.legend()
でグラフを描くことが可能です。
この記事が気に入ったらサポートをしてみませんか?