質問です。
wineのデータ(qualityとその他情報)を、品質ごとにグループ分けしてその数を数える、ということをやろうとしています。コードは以下の通りです。
python
1import pandas as pd 2 3wine=pd.read_csv("winequality-white.csv", sep=";", encoding="utf-8") 4 5count_data=wine.groupby("quality")["quality"].count() 6print(count_data)
これでエラー無く実行できました。ですが、一つ疑問があります。
「count_data=wine.groupby("quality")["quality"].count()」ここの部分はどういう構造になっているのですか??groupby("quality")までは、groupbyの特性としてqualityごとにグループ分けをしていることが理解できるのですが、それ以降の部分が理解できません。
ご回答お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/22 08:46
回答1件
0
ベストアンサー
- count_data=wine.groupby("quality")["quality"].count() はなにをやっているか。
複雑でわかりにくいものはバラバラにして調べるのが常道です。
- wine.groupby("quality")の調べ方
python
1>>> print(wine.groupby("quality")) 2<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000027613BAE070> 3>>> print(type(wine.groupby("quality"))) 4<class 'pandas.core.groupby.generic.DataFrameGroupBy'>
これが何かを調べるために、以下を実行してみてください。
python
1>>> print(pd.core.groupby.generic.DataFrameGroupBy) 2<class 'pandas.core.groupby.generic.DataFrameGroupBy'> 3>>> print(pd.core.groupby.generic) 4<module 'pandas.core.groupby.generic' from 'C:\Users\myname\anaconda3\lib\site-packages\pandas\core\groupby\generic.py'>
これが意味するのは、以下の二点です。
0. pandas.core.groupby.genericというモジュールは'C:\Users\myname\anaconda3\lib\site-packages\pandas\core\groupby\generic.py'というファイルを読んで作られている。
0. wine.groupby("quality")は、pandas.core.groupby.genericというモジュールの中で定義されているクラスDataFrameGroupByのインスタンスである。
モジュールについては、公式ドキュメント チュートリアル 6. モジュールをお読みください。
クラとインスタンスについては、公式ドキュメント チュートリアル 9. クラスをお読みください。
- groupby("quality")までは、groupbyの特性としてqualityごとにグループ分けをしていることが理解できる
それは誤解です。
groupby("quality")メソッドでDataFrameGroupByのインスタンスを作成しましたが、まだグループ分けはしていません。
python
1>>> for key,value in wine.groupby("quality").__dict__.items(): 2... print(key, ':', value) 3... 4_selection : None 5level : None 6as_index : True 7keys : quality 8sort : True 9group_keys : True 10squeeze : False 11observed : False 12mutated : False 13dropna : True 14obj : fixed acidity volatile acidity citric acid residual sugar ... pH sulphates alcohol quality 150 7.0 0.27 0.36 20.7 ... 3.00 0.45 8.8 6 161 6.3 0.30 0.34 1.6 ... 3.30 0.49 9.5 6 172 8.1 0.28 0.40 6.9 ... 3.26 0.44 10.1 6 18... ... ... ... ... ... ... ... ... ... 194895 6.5 0.24 0.19 1.2 ... 2.99 0.46 9.4 6 204896 5.5 0.29 0.30 1.1 ... 3.34 0.38 12.8 7 214897 6.0 0.21 0.38 0.8 ... 3.26 0.32 11.8 6 22[4898 rows x 12 columns] 23axis : 0 24grouper : <pandas.core.groupby.ops.BaseGrouper object at 0x0000027613BE6EE0> 25exclusions : {'quality'}
をみればわかるように、作られたDataFrameGroupByのインスタンスの属性objにはデータフレームwineがそのまま入っているだけです。まだグループ分けはしていません。
- wine.groupby("quality")["quality"]の調べ方
初心者のうちは、ここが一番わかりにくいでしょう。
python
1[]は特殊メソッド__getitem__を呼び出します。 2 3>>> wine.groupby("quality").__getitem__ 4<bound method DataFrameGroupBy.__getitem__ of <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000027613BAE070>> 5 6なぜ__getitem__を呼び出すかは以下読んでください。
公式ドキュメント 言語リファレンス 3.3.7. コンテナをエミュレートする
wine.groupby("quality")["quality"]とwine.groupby("quality").getitem("quality")が同じことをやっているのを確認するには、以下を実行してみてください。
python
1>>> wine.groupby("quality").__getitem__("quality") 2<pandas.core.groupby.generic.SeriesGroupBy object at 0x0000027613CCC4F0> 3>>> print(wine.groupby("quality")["quality"]) 4<pandas.core.groupby.generic.SeriesGroupBy object at 0x0000027613CFB670>
アドレスが違うのは二回呼び出しているためで、中身は同じです。
wine.groupby("quality")["quality"]が何であるかを調べるために、以下を実行してみてください。
python>>>
1<class 'pandas.core.groupby.generic.SeriesGroupBy'>
これからわかるように、wine.groupby("quality")は、クラスDataFrameGroupByのインスタンスであったのに対して、wine.groupby("quality")["quality"]はクラスSeriesGroupByのインスタンスです。
どこが違うのかを調べるために以下を実行してみてください。
python
1>>> for key,value in wine.groupby("quality")["quality"].__dict__.items(): 2... print(key, ':', value) 3... 4_selection : quality 5level : None 6as_index : True 7keys : None 8sort : True 9group_keys : True 10squeeze : False 11observed : False 12mutated : False 13dropna : True 14obj : 0 6 151 6 162 6 17 .. 184895 6 194896 7 204897 6 21Name: quality, Length: 4898, dtype: int64 22axis : 0 23grouper : <pandas.core.groupby.ops.BaseGrouper object at 0x0000027613CBC670> 24exclusions : set()
つまり、wine.groupby("quality").__dict__と比べると、wine.groupby("quality")の場合は属性objがDataFrameでしたが、wine.groupby("quality")["quality"]では属性objがSeriesに変わっています。
- countは何をしているか。
この場合、countはpandas.core.groupby.generic.SeriesGroupByというクラスのインスタンスメソッドです。
python
1>>> type(wine.groupby("quality")["quality"]).__dict__['count'] 2<function SeriesGroupBy.count at 0x000002761396B700>
このメソッドの説明だけでよければ、以下で読むことができます。(英語です)
python
1print(wine.groupby("quality")["quality"].count.__doc__)
このメソッドが何をやっているかを本当に知りたければsite-packages/pandas/core/groupby/generic.pyの804行目あたりにある、「def count(self)」からはじまるメソッド定義を読めば良いのです。
pandasの公式マニュアルは、pandas.DataFrame.groupby
とかpandas.Series.groupby
なのですが、あまり詳しく書いていないので、最後はソースを読むしかありません。
投稿2021/08/23 12:43
総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/24 09:10
2021/08/24 10:50
2021/08/24 11:12
2021/08/26 02:26
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。