dplyr使いのためのpandas dfplyすごい編

#はじめに
###dfplyすごい
以前からR, とりわけdplyrユーザーのpandas操作のために記事をまとめてきましたが、dplyr同様の操作は実現できていませんでした。**が、**ついにdfplyという素晴らしいライブラリを見つけましたので記事にまとめます。

**関連シリーズ**
[dplyr使いのためのpandas dfply データ加工編（tidyr）](https://qiita.com/T_Shinomiya/items/b832ceafa8fc4da7f73e)
[dplyr使いのためのpandas dfplyでもJOIN編]
(https://qiita.com/T_Shinomiya/items/cca75a0bd1b0b1663dbf)
[dplyr使いのためのpandas dfply window関数編]
(https://qiita.com/T_Shinomiya/items/327cc073e8079eabe242)

**以前の記事はコチラ**
[dplyr使いのためのpandas 基礎編](https://qiita.com/T_Shinomiya/items/d445ce2f3d95160ec944)
[dplyr使いのためのpandas スライスsliceとインデックスindex編](https://qiita.com/T_Shinomiya/items/f800ac988d7a1e25bf8b)
[dplyr使いのためのpandas マルチカラム操作編](https://qiita.com/T_Shinomiya/items/78a9695dff796dccaed5)

**dplyr? ってかたはコチラ（敬愛するmatsuou1氏の記事）**
[dplyrを使いこなす！基礎編]
(https://qiita.com/matsuou1/items/e995da273e3108e2338e)

#dfplyのなにがすごい？
dplyrの機能が**ほぼそのまま実装されている**ところです。
では、例を見ていきましょう。

#事前準備、例データ
例データはseabornライブラリに付属しているみんな大好きtitanicを使います。

```Python:Python：事前準備
import pandas as pd
import numpy as np
from dfply import * #dfply読み込み

import seaborn as sns
titanic = sns.load_dataset('titanic') #titanic読み込み
#titanic.head(10)
```

##select 列選択
```Python:Python：dfply-select
titanic >> select(X.survived, X.pclass, X.sex, 3, ['fare']) >> head(5)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/d4c268dc-58fd-cff1-e563-b980ed4c5429.png)

- 変数の指定形式は「X.」を付ける、「列番号」「リスト表記[]」のどれかです。X.形式が一番使いやすいかと。
- magritterは、「%>%」ではなく「>>」です。

###drop
列を除くdropもあります。

```Python:Python：dfply-drop
titanic >> select(~X.survived, ~X.pclass, ~X.sex) >> head(5)
or
titanic >> drop(X.survived, X.pclass, X.sex) >> head(5)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/62fa9fd5-b06b-7f4f-0f0a-7d7bdf6f6e87.png)

###列選択関数
他にも列を選択する関数が用意されています。

|      関数        |                     構文                 |            説明    |
|:---------------:|:-----------------------------------------:|:------------------------------------:|
| starts_with     | select(starts_with('p'))                  |列名がpではじまる列を取得   |
| end_with        | select(ends_with('s'))                    |列名がsでおわる列を取得  |
| contains        | select(contains('e'))                     |列名にeを含む列を取得   |
| ~               | select(~contains('e'))                    |列名にeを含まない列を取得   |
| columns_between | select(columns_between(X.sex, X.fare))    |sex~fareの間の列を取得|
| columns_to      | select(columns_to(X.age, inclusive=True)) |ageより前の列を取得|
| columns_from    | select(columns_from(X.age))               |age以降の列を取得|



##filter_by 行選択
```Python:Python：dfply-filter
titanic >> filter_by(X.sex == 'male') >> #sexがmaleのレコードを抽出
    select(X.survived, X.pclass, X.sex, X.age) >> head(3)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/7ac852f7-a9fb-62bd-fa54-1b3d0f4d7f5e.png)

###null値（NoneやNan）の行選択
```Python:Python：dfply-filter（NoneやNaNの抽出）
titanic >> filter_by(X.age.isnull()) >> #.isnull()で
    select(X.survived, X.pclass, X.sex, X.age) >> head(3)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/5f975292-d9b8-eeee-a9c8-e946070d7bb6.png)


###index_slice指定でも可（row_slice）
```Python:Python：dfply-row_slice
titanic >> row_slice([0,1,5]) >> select(X.survived, X.pclass, X.sex, X.age)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/021cafe5-b81d-d014-297a-d5dad52f8eba.png)

##mutate 列追加
```Python:Python：dfply-mutate
#mutate
titanic >> mutate(new_column = X.survived + X. sibsp) >> #new_columnを作成
   select(X.survived, X.sibsp, X.new_column) >> head(3)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/e181f2a8-6e60-4f9d-dbc5-8ce1dbcc7fe7.png)

###transmute 作成した列のみにselect
```Python:Python：dfply-transmute
titanic >> transmute(new_column = X.survived + X. sibsp) >> head(5)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/71addaec-0ec3-eda4-9741-e40dae101e84.png)

##arrange 並び替え
```Python:Python：dfply-arrange
titanic >> arrange(X.age, ascending = False) >> select(X.age) >> head(3)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/e90ae2d1-ec27-0052-a7fc-dba75dcdb9f8.png)

##rename 列名変更
```Python:Python：dfply-rename
titanic >> rename(AGE = X.age) >> select(X.AGE) >>head(2)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/ed283106-3fff-1ff3-62ac-bc726e820c72.png)

##distinct 重複レコード除去
```Python:Python：dfply-distinct
titanic >> distinct(X.sex) >> select(X.survived, X.pclass, X.sex)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/cd577359-a287-74e3-f151-305396e2a142.png)

##group_by 集約
```Python:Python：dfply-group_by
titanic >> group_by(X.sex) >>
    mutate(age_lead = lead(X.age), age_lag = lag(X.age)) >>
    head(3) >> select(X.sex, X.age, X.age_lead, X.age_lag)
#lead()とlag()は一つずらした値をとるwindow関数です。
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/07896227-5ab1-2ea7-299a-57836475660c.png)

##summarise 要約
```Python:Python：dfply-summarise
titanic >> summarise(age_median = X.age.median())
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/900e327a-fd67-ad0d-eef5-8647eaf9a418.png)

###summarise_each 指定した列に複数の関数を適用して要約
```Python:Python：dfply-summarise_each
titanic >> group_by(X.sex) >> summarise_each([np.mean, np.var], X.age, 4, 'pclass')
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/e2ed97cd-d21e-b7bf-78ba-d2e3f7126482.png)

##データ加工
###case_when, if_else
dplyrのベクトル変換関数も使えます。

```Python:Python：dfply-case_when,if_else
#case_when
titanic >> mutate(new_column = case_when([X.survived ==0, '死亡'],[X.survived==1, '生存'])) >>
    select(X.survived, X.new_column) >> head(3)

#if_else
titanic >> mutate(new_column = if_else(X.survived ==0, '死亡', '生存')) >>
    select(X.survived, X.new_column) >> head(3)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/11e6aa0b-2f08-713b-f01d-d4eb8166bd51.png)

###na_if
条件に合致した要素をNaNに変換します


```Python:Python：dfply-na_if
#na_if
titanic >> mutate(survived_null = na_if(X.survived,0)) >>
    select(X.survived, X.survived_null) >> head(3)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/318124/8a05a261-e855-d755-0676-e42366d391c0.png)



##補足：日付型 ⇄ 文字型の変換
こちらにまとめました
[pandasデータフレームの日付型⇄文字型変換とdfply使用時のメモ](https://qiita.com/T_Shinomiya/items/ff9d845c6f23fd8f1ba2)




#まとめ
R,dplyrユーザーがPython,pandasに移行する際の強力なライブラリになりそうです。
まだまだdplyr同様の機能があり、紹介できておりませんので、またの機会に。
これからはdfplyでデータ操作にラクラク励めそうです。