はじめに
こんにちは。
最近はデータサイエンス100本ノックに少しずつ取り組んでいます。このデータサイエンス100本ノックは、なんとなく名前から推測できるかもしれませんが、データサイエンスにおけるデータの加工についての演習問題が100問出されます。これを解いていくことで、データサイエンスにおけるデータの加工により慣れていくというわけです。ちなみに演習で回答がある言語はPythonとR、SQLとなっています。親切にもJuliaで解いてくださっている方もおり、解答例を公開してくださっています。
さて、その中で僕はPythonとRとJuliaを使って少しずつ進めているのですが、なんとなくそれぞれの言語の癖みたいなのがあって、言語によって行いやすい処理などがあります。特にこの100本ノックにおけるデータ加工においては、Rのdplyrで行うのが行いやすいなーというのが著者の所感です。というのも、パイプ演算子(%>%)を使って書くとスマートで見やすく、自分の中でも何を書いているのか迷わないというのが理由です。
そこで今回は、このRのdplyrにおけるパイプ演算子の様に各言語でも
処理できないかと色々調べたところ、Pythonではpandasにおいて擬似的にパイプ演算子を実現できたり、JuliaではDataFramesMeta.jlを使うことで、同じ様に表現できることがわかったので、これらを対応表にまとめたいと思います。
対応表
以下にPython_pandasとR_dplyrとJulia_DataFramesMetaの対応表をまとめます。それぞれの項目において他にも方法がある場合もありますが、とりあえず代表的なものを一つ挙げています。
Python pandas | R dplyr | Julia DataFramesMeta | |
---|---|---|---|
パイプ | .\(擬似的) | %>% | |> |
列選択 | filter | select | select |
行選択 | query | filter | where |
並び替え | sort_values | arrange | orderby |
集計 | agg | summarise | combine |
グループ化 | groupby | group_by | groupby |
列追加 | eval | mutate | transform |
列名変更 | rename | rename | rename |
pandasにおけるパイプに関しては、.\(擬似的)
としています。これは処理をつなぐ.
と改行である\
を使うことで、擬似的にパイプのように見せることが可能です。この方法以外にも、dfplyを使ったりといった方法もあるようです。
コード例
以下にこれらを使った操作の例を記載していきます。
データセット
Python pandas
import pandas as pd
df = pd.DataFrame({'x':[1, 1, 2, 2], 'y':[5, 6, 7, 8]})
R dplyr
library(tidyverse)
df <- tibble(a=c(1, 1, 2, 2), b=c(5, 6, 7, 8))
Julia DataFramesMeta
using DataFrames
df = DataFrame(x = [1, 1, 2, 2], y = [5, 6, 7, 8])
それぞれ以下のようなデータフレームを取得できます。
a | b |
---|---|
1 | 5 |
1 | 6 |
2 | 7 |
2 | 8 |
これを使用します。
コード例
Python pandas
df2 = df.\
eval("c = a * b").\ #列追加
eval("d = a + b").\ #列追加
filter(items = ["a", "c", "d"]).\ #列選択
query("c > 10").\ #行選択
sort_values("d", ascending = False) #並び替え(降順)
R dplyr
df2 <- df %>%
mutate(c = a * b, d = a + b) %>% #列追加
select(a, c, d) %>% #列選択
filter(c > 10) %>% #行選択
arrange(desc(d)) #並び替え(降順)
Julia DataFramesMeta
df2 = @linq df |> #@linqをつけることで続けて処理可能に
transform(c = :a .* :b, d = :a + :b) |> #列追加
select(:a, :c, :d) |> #列選択
where(:c .> 10)|> #行選択
orderby(-:d) #並び替え(降順)
実行すると、それぞれ以下のようにデータフレームが取得できます。
a | c | d |
---|---|---|
2 | 16 | 10 |
2 | 14 | 9 |
pythonの特徴としては、引数を""(ダブルクォーテーションもしくはクォーテーション)で囲みます。
Rは全体的にスッキリした書き方ができる印象です。
juliaは一番初めに@linq
をつけて始めます。
まとめ
今回は、Pythonのpandas と Rのdplyr と JuliaのDataFramesMetaそれぞれのデータ処理においてパイプ演算子を使う方法とその対応表を簡単にまとめました。
それぞれ同じように記述ができるので、それぞれの言語を行き来する時のために覚えておくと便利だなと感じました。
今回はここまでです。
参考サイト
python pandas と R tidyverseの比較
dplyr使いのためのpandas 基本編
dplyr のアレを Pandas でやる
DataFramesMeta.jl
R & Python Rosetta Stone: EDA with dplyr vs pandas
dplyr使いのためのpandas dfplyすごい編
DataFramesMeta.jl
コメント