Python Pandas基礎⑤ -データ集計（groupby）-

### 初めに
PythonのPandasについて初学者なりにまとめたいと思います。
学習に使っているのはこちらのキノコードです。

https://kino-code.com/category/introductory-course-pandas/

JupyterLabを使用します。

### 使用するExcelファイル
こちらを[リンク先を保存して](http://kino-code.com/wp-content/uploads/2020/08/sample.xlsx)ローカルに落として利用しています。

### データ集計
#### 前準備
jupyterlabを起動し、エクセルファイルをカレントディレクトリに格納。Pandasをimportし、表示数を変更します。
その後、read_excelで読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/bd52b8bf-f76b-bad0-883c-e427e9faa7e8.png)

#### 氏名ごとの平均を算出
groupbyメソッドを使用することで、指定のカラムごとにデータをまとめたGroupByオブジェクトを作成することができます。
平均の集計にはmeanメソッドを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/dbf301a2-0cdd-d555-d7a0-2e3034178d6a.png)

#### 氏名ごとの売上金額のみ平均を算出
氏名と売上金額のみのデータフレームを作成して平均を抽出します。
データフレームから任意のカラムを抽出して、新たなデータフレームを作成するには下記のように記述します。
データフレームオブジェクト[抽出したいカラム名のリスト]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/7a8576e8-1a2c-3680-9157-9b3124f825b0.png)

#### 小数点以下を切り捨てて表示
小数点以下を非表示にするには、2通りの方法があります。
いずれもformatメソッドを使用しますが、適用方法が異なります。
・1つ目は、options属性で小数の書式を変更する方法です。
float_format属性に、formatメソッドの内容を代入します。
```python
pd.options.display.float_format = '{:.0f}'.format
```
・2つ目は、applymapメソッドで適用させる方法です。
applymapメソッドの引数に、formatメソッドの内容を指定することにより、データフレームの各要素にformatメソッドで指定した書式が適用されます。
```python
df[['氏名', '売上金額']].groupby('氏名').mean().applymap('{:.0f}'.format)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/5a6d5ae7-c463-ce7f-62ca-7a97a80556ca.png)

#### 小数点以下2桁を切り捨て
formatメソッドでは、「:.小指数点以下の桁数f」で、小数点以下の桁数を設定することができます。
```python
# 0桁
'{:.0f}'
# 2桁
'{:.2f}' 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/956053d2-799b-f69c-9c2b-fef2852c44a2.png)

#### 合計を算出
sumメソッドを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/c68390d8-dcc7-3dac-7979-7143f67f3657.png)

#### 要素数を算出
countメソッドを使用します。
countメソッドは欠損値を除いた数を集計します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/86dbe22f-0d82-5666-46be-81fd7d57f4c0.png)

#### 特定の要素数を算出
ilocまたはlocプロパティを使用すると、データフレームから指定の行や要素を抽出することができます。
角括弧内に行番号を指定すると、その行のデータをシリーズで取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/ec518894-b33c-db86-4c2c-c57569411f4b.png)



#### 欠損値込みの要素数を算出
欠損値込みのデータフレームの要素数を集計するにはsizeメソッドを使用します。
sizeメソッドの取得結果は、シリーズで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/27ce9673-3705-8357-dead-87b03fe6ff1d.png)

#### グループのn行目を抽出
グループごとにn行目のデータのみ取得するには、nthメソッドを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/ba32aac8-664a-8694-20fa-6fa559b35aae.png)

#### 降順に並び替えかつn番目を抽出
dfをsort_valuesメソッドで降順に並び替え、nthメソッドを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/e0f1711f-96ef-6a93-45c2-485e665d8baa.png)

#### 氏名ごとの最大値を抽出
最大値はmax()メソッドを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/dce612db-0229-bd88-3125-7db5d7a3db38.png)

#### 氏名ごとの最小値を抽出
最小値はmin()メソッドを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/daa4bece-d2ea-a43b-37c2-6f257ce089e0.png)

#### 氏名と商品分類ごとに平均を算出
平均はmean()メソッドを使用します。
併せて小数点以下を切り捨てします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/26acf00e-422b-7fe8-9184-fb16dc9d6e1f.png)

#### マルチインデックスを解除する
複数のグルーピングを行うとマルチインデックスになります。
インデックスをグルーピングされたくない場合はgroupbyにas_index=Falseを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/322ee550-59cc-c045-1427-08344d45b60f.png)

#### 複数の集計を行うaggメソッド
複数の集計方法をまとめて行う場合には、aggメソッドを併せて使用します。
aggメソッドの引数に、集計方法をリストで指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/a66f2523-f7c1-36a0-3ebf-5ed1ff4775e7.png)

#### 3桁ごとにカンマを振る
applymap()メソッドで'{:,.0f}'を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/784fc8b0-7946-b874-5ca9-6366a0fd15f0.png)

#### 表示形式を変更する
桁区切り文字をアンダースコアに、小数点以下を1桁まで切り捨てをしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/9c5e3c3c-adef-a794-d1e4-09380170f438.png)

#### 平均、合計、個数、最大値、最小値、標準偏差、分散を抽出
標準偏差はstd、分散はvarで抽出できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/bfb552a8-56a3-7c49-8228-9f84e2c3f6bc.png)

#### 要約統計量を抽出
aggメソッドにdescribeを渡すことでようやく統計量を抽出できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/b2638ca5-f228-2088-7b58-514a918f02f4.png)

#### 列ごとに別々に集計
aggメソッドに辞書型で{列名：[集計方法, 集計方法],列名: [集計方法, 集計方法]}と複数指定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/ce1724f2-a200-9b87-15fb-81331eefee38.png)

#### 関数を使用して集計
売上金額を税込みで集計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/d3f03ed3-9279-137f-b327-417c03e311a7.png)

### 終わり
groupbyだけでなくpivot_tableでの集計方法もあるのでそちらも学びたいと思います。


### 関連する過去の記事

https://qiita.com/y-matsunaga/items/c90289ddbed20e6a9407

https://qiita.com/y-matsunaga/items/1e6e4cf051d141b347b8

https://qiita.com/y-matsunaga/items/8a338b684b76d1a92c82

https://qiita.com/y-matsunaga/items/094f253a7e982085e920