Pandasでデータ集計をする際に最低限覚えておきたいメソッド

基礎集計の際によく使うものをメモ、随時更新予定

### 前準備
```Python
from sklearn import datasets
import pandas as pd
from collections import OrderedDict

iris = datasets.load_iris()

df = pd.concat([pd.DataFrame(iris.data,columns=iris.feature_names),pd.DataFrame(iris.target,columns=["species"])],axis=1)
```

![スクリーンショット 2017-05-09 9.51.52.png](https://qiita-image-store.s3.amazonaws.com/0/116528/9b767ef7-543e-8783-5c74-0f5babe2ab54.png)

最近のアップデートで、pandasが見やすくなったのは嬉しい

### 集計

#### describe
```Python
df.describe()
```

![スクリーンショット 2017-12-22 14.42.57.png](https://qiita-image-store.s3.amazonaws.com/0/116528/cf024df4-ccd8-7aad-2842-bd81ba017af2.png)

基本統計量は出力できる

```Python
df["petal length (cm)"].describe()
```

![スクリーンショット 2017-05-09 9.34.06.png](https://qiita-image-store.s3.amazonaws.com/0/116528/4f18dbde-cbdf-00f1-117c-63408eb3687b.png)

Seriesだけでも算出可能

#### value_counts
```Python
df["species"].value_counts()
```

![スクリーンショット 2017-05-09 9.36.35.png](https://qiita-image-store.s3.amazonaws.com/0/116528/721c5369-e38a-e8dd-7fd5-6f05a10fba55.png)

カウントが可能

#### get_dummies
```Python
pd.get_dummies(df["species"]).ix[[0,1,2,50,51,52,100,101,102]]
```

![スクリーンショット 2017-05-09 9.37.32.png](https://qiita-image-store.s3.amazonaws.com/0/116528/51b5b4f4-6919-e0d9-5fbc-930f371ac03b.png)

いわゆるダミー変数が作成可能
(見やすいように、インデックスを指定済み)

#### sort_values
```Python
df.sort_values("sepal length (cm)",ascending=False)
```

![スクリーンショット 2017-05-09 9.38.41.png](https://qiita-image-store.s3.amazonaws.com/0/116528/f539f94e-c6ee-b5ad-e0ce-6e1680a828ce.png)

dfのソートが可能（ascendingで昇順降順を指定）

```Python
df.sort_values(["sepal length (cm)","sepal width (cm)"],ascending=False)
```

![スクリーンショット 2017-05-09 9.55.50.png](https://qiita-image-store.s3.amazonaws.com/0/116528/ce05c132-e996-5072-da1b-97a510323b48.png)

複数指定も可能（優先度は引数のlistのインデックス）

#### groupby
```Python
df_groupby = df.groupby("species",as_index=False)
df_groupby.mean()
```

![スクリーンショット 2017-05-09 9.57.37.png](https://qiita-image-store.s3.amazonaws.com/0/116528/1417cf57-ff11-690c-cf81-505582697b0f.png)


groupbyオブジェクトを再利用できるため、同じような集計を複数かけたいときはgroupbyオブジェクトを変数に格納したほうが早い

#### groupby.agg
```Python
df_groupby.agg({"sepal length (cm)": "mean",
                "sepal width (cm)": ["mean","count"],
                "petal length (cm)": ["max","min"],
                "petal width (cm)": ["sum","var","std"]})
```

![スクリーンショット 2017-05-09 9.43.42.png](https://qiita-image-store.s3.amazonaws.com/0/116528/c8d0fb7d-c74b-a1ca-fb8c-028be1b78cbc.png)


辞書形式で指定することで、カラムごとの個別集計が可能（ただし、一つのカラムに複数の集計を指定した場合、マルチカラムになるため、注意が必要）

また、こちらは順不同になるため、順序を指定したい場合はOrderedDictを利用する

```Python
df_groupby.agg(OrderedDict((["sepal length (cm)", "mean"],
                            ["sepal width (cm)", ["mean","count"]],
                            ["petal length (cm)", ["max","min"]],
                            ["petal width (cm)", ["sum","var","std"]])))
```

![スクリーンショット 2017-05-09 9.59.54.png](https://qiita-image-store.s3.amazonaws.com/0/116528/380dd9b0-54af-e57f-f8d9-6cddbea3625b.png)

#### to_csv
```Python
df.to_csv("test.csv",index=False,encoding="utf8")
pd.read_csv("test.csv")
```

![スクリーンショット 2017-05-09 9.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/116528/25793d5b-dd2d-7275-f1b2-e645e26a0948.png)

index=Falseにすると、次の読み込みが楽
encodingを指定しないと読み込めない時がある（とくにWindows）

### 可視化

#### 前準備
```Python
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
```

``%matplotlib inline``はJupyter内に可視化するためのマジックコマンド

#### 箱ひげ図
``sns.boxplot(data=df, x="species", y="sepal length (cm)")``

![スクリーンショット 2017-12-22 14.50.52.png](https://qiita-image-store.s3.amazonaws.com/0/116528/5d47bd34-f691-69f7-d3ac-77ad665fc433.png)

#### pairplot
``sns.pairplot(data=df)``

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/116528/cf1bc641-7dae-6009-d3f3-1bd80b15d765.png)

``sns.pairplot(data=df, hue="species")``

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/116528/6ddc028e-9f04-c40c-1911-668a6d2c67e4.png)

セグメント別に分けることもできる

#### jointplot
``sns.jointplot(data=df, x="sepal length (cm)", y="sepal width (cm)", kind="kde")``

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/116528/fab83520-c87f-ea6c-d254-65533fe3a753.png)

#### distplot
``sns.distplot(df["sepal length (cm)"], rug=True,)``

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/116528/501c6a52-8f5e-ddfa-ed08-8952d267b459.png)