インターネットで R と Python を検索すると、データの操作にどちらが優れていて、速く、便利であるかというテーマに関する何百万もの記事や議論が見つかります。 しかし、残念ながら、これらの記事や論争はすべて特に役に立ちません。
この記事の目的は、両方の言語の最も一般的なパッケージの基本的なデータ処理手法を比較することです。 そして、読者がまだ知らないことをすぐにマスターできるように支援します。 Python で記述している人は、同じことを R で行う方法、またはその逆の方法を調べてください。
この記事では、R で最も人気のあるパッケージの構文を分析します。これらはライブラリに含まれるパッケージです。 tidyverse
そしてパッケージも data.table
。 そしてそれらの構文を次のものと比較してください pandas
、Python で最も人気のあるデータ分析パッケージ。
データの読み込みから、Python と R を使用した分析ウィンドウ関数の実行まで、データ分析の全パスを段階的に説明します。
ページ内容
この記事は、検討中のパッケージの XNUMX つでデータ処理操作を実行する方法を忘れた場合のチートシートとして使用できます。
R と Python の主な構文の違い
1.1.パッケージ関数へのアクセス
1.2.割り当て
1.3.索引付け
1.4.メソッドとOOP
1.5.パイプライン
1.6.データ構造 使用するパッケージについて一言
2.1.きちんとした
2.2.データ表
2.3.パンダ パッケージのインストール データのロード データフレームの作成 必要な列の選択 行のフィルタリング グループ化と集約 テーブルの垂直結合 (UNION) テーブルの水平結合(JOIN) 基本的なウィンドウ関数と計算列 RとPythonのデータ処理方法の対応表 まとめ 使用しているパッケージに関する簡単なアンケート
データ分析に興味がある場合は、私の記事をご覧ください。
R と Python の主な構文の違い
Python から R、またはその逆に簡単に切り替えられるように、注意する必要がある主なポイントをいくつか示します。
パッケージ関数へのアクセス
パッケージが R にロードされると、その機能にアクセスするためにパッケージ名を指定する必要はありません。 ほとんどの場合、これは R では一般的ではありませんが、許容されます。 コード内でパッケージの関数の XNUMX つが必要な場合、パッケージをインポートする必要はまったくありません。パッケージの名前と関数の名前を指定して呼び出すだけです。 R のパッケージ名と関数名の間の区切り文字は二重コロンです。 package_name::function_name()
.
逆に、Python では、名前を明示的に指定してパッケージの関数を呼び出すことが古典的であると考えられています。 パッケージがダウンロードされるとき、通常、パッケージには短縮名が付けられます。 pandas
通常は仮名が使用されます pd
。 パッケージ関数にはドットを介してアクセスします package_name.function_name()
.
割り当て
R では、矢印を使用してオブジェクトに値を割り当てるのが一般的です。 obj_name <- value
単一の等号は許可されていますが、R の単一の等号は主に関数の引数に値を渡すために使用されます。
Python では、代入は単一の等号のみで行われます。 obj_name = value
.
索引付け
ここにもかなり大きな違いがあります。 R では、インデックス付けは XNUMX から始まり、結果の範囲内の指定されたすべての要素が含まれます。
Python では、インデックス付けは XNUMX から始まり、選択された範囲にはインデックスで指定された最後の要素は含まれません。 だからデザイン x[i:j]
Python では j 要素は含まれません。
R 表記における負のインデックス付けにも違いがあります。 x[-1]
最後の要素を除くベクトルのすべての要素を返します。 Python では、同様の表記法で最後の要素のみが返されます。
メソッドとOOP
R は独自の方法で OOP を実装します。これについては記事で書きました tydiverse
よりも簡単になります pandas
。 私の主観かもしれませんが。
つまり、R のオブジェクトにはメソッドがありません (S3 クラスについて言えば、それほど一般的ではない他の OOP 実装もあります)。 オブジェクトのクラスに応じて異なる方法で処理する一般化された関数のみがあります。
パイプライン
おそらくこれが名前です pandas
完全に正しいわけではありませんが、意味を説明してみます。
中間計算を保存したり、作業環境に不要なオブジェクトを生成したりしないようにするために、一種のパイプラインを使用できます。 それらの。 計算の結果をある関数から次の関数に渡し、中間結果は保存しません。
次のコード例を見てみましょう。中間計算を別のオブジェクトに保存します。
temp_object <- func1()
temp_object2 <- func2(temp_object )
obj <- func3(temp_object2 )
3 つの操作を連続して実行し、それぞれの結果が別のオブジェクトに保存されました。 しかし実際には、これらの中間オブジェクトは必要ありません。
あるいはさらに悪いことに、Excel ユーザーにとってはより馴染みのあるものになります。
obj <- func3(func2(func1()))
この場合、途中の計算結果を保存しませんでしたが、入れ子関数を含むコードを読み取るのは非常に不便です。
R でのデータ処理のいくつかのアプローチを見ていきますが、それらはさまざまな方法で同様の操作を実行します。
ライブラリ内のパイプライン tidyverse
オペレーターによって実装される %>%
.
obj <- func1() %>%
func2() %>%
func3()
したがって、作業の結果を受け取ります func1()
それを最初の引数として渡します func2()
、この計算の結果を最初の引数として渡します。 func3()
。 そして最後に、実行されたすべての計算をオブジェクトに書き込みます。 obj <-
.
上記のすべては、このミームによって言葉よりもよく説明されています。
В data.table
チェーンも同様に使用されます。
newDT <- DT[where, select|update|do, by][where, select|update|do, by][where, select|update|do, by]
各角括弧内では、前の操作の結果を使用できます。
В pandas
このような操作はドットで区切られます。
obj = df.fun1().fun2().fun3()
それらの。 私たちはテーブルに着きます df そして彼女の方法を使う fun1()
、得られた結果にメソッドを適用します。 fun2()
後に fun3()
。 結果はオブジェクトに保存されます オブジェクト .
データ構造
R と Python のデータ構造は似ていますが、名前が異なります。
説明
Rの名前
Python/pandas での名前
テーブル構造
data.frame、data.table、ティブル
データフレーム
値の XNUMX 次元リスト
ベクトル
pandas のシリーズまたは純粋な Python のリスト
マルチレベルの非表形式構造
リスト
辞書 (辞書)
以下では、その他の機能と構文の違いについて見ていきます。
使用するパッケージについて一言
まず、この記事でよく知るパッケージについて少し説明します。
きちんとした
公式サイト:
図書館 tidyverse
RStudio の上級研究員である Hedley Wickham によって書かれました。 tidyverse
は、データ処理を簡素化する印象的なパッケージのセットで構成されており、そのうち 5 つは CRAN リポジトリからのダウンロードのトップ 10 に含まれています。
ライブラリのコアは次のパッケージで構成されます。 ggplot2
, dplyr
, tidyr
, readr
, purrr
, tibble
, stringr
, forcats
。 これらの各パッケージは、特定の問題を解決することを目的としています。 例えば dplyr
データ操作のために作成された、 tidyr
データをきちんとした形にするために、 stringr
文字列の操作が簡素化され、 ggplot2
は、最も人気のあるデータ視覚化ツールの XNUMX つです。
利点 tidyverse
シンプルで読みやすい構文であり、多くの点で SQL クエリ言語に似ています。
データ表
によって data.table
H2O.ai のマット・ドールです。
このライブラリの最初のリリースは 2006 年に行われました。
パッケージの構文は次のように便利ではありません。 tidyverse
R の古典的なデータフレームをより彷彿とさせますが、同時に機能が大幅に拡張されています。
このパッケージ内のテーブルを使用したすべての操作は角かっこで説明されており、構文を翻訳すると次のようになります。 data.table
SQL では、次のような結果が得られます。 data.table[ WHERE, SELECT, GROUP BY ]
このパッケージの強みは、大量のデータの処理速度です。
パンダ
公式サイト:
ライブラリの名前は、多次元構造の情報セットを表すために使用される計量経済用語「パネル データ」に由来しています。
によって pandas
アメリカ人のウェス・マッキニーです。
Python でのデータ分析に関して言えば、 pandas
いいえ。 あらゆるソースからのデータのロードから視覚化まで、データを使用してあらゆる操作を実行できる、非常に多機能で高レベルのパッケージです。
追加パッケージのインストール
この記事で説明するパッケージは、基本的な R および Python ディストリビューションには含まれていません。 少し注意点がありますが、Anaconda ディストリビューションをインストールしている場合は、追加でインストールしてください。 pandas
必須ではありません。
R にパッケージをインストールする
RStudio 開発環境を少なくとも XNUMX 回開いたことがある場合は、必要なパッケージを R にインストールする方法をすでに知っているでしょう。パッケージをインストールするには、標準のコマンドを使用します。 install.packages()
R 自体で直接実行することによって。
# установка пакетов
install.packages("vroom")
install.packages("readr")
install.packages("dplyr")
install.packages("data.table")
インストール後、パッケージを接続する必要があります。ほとんどの場合、このコマンドが使用されます。 library()
.
# подключение или импорт пакетов в рабочее окружение
library(vroom)
library(readr)
library(dplyr)
library(data.table)
Python でのパッケージのインストール
したがって、純粋な Python がインストールされている場合は、 pandas
手動でインストールする必要があります。 オペレーティング システムに応じてコマンド ラインまたはターミナルを開き、次のコマンドを入力します。
pip install pandas
次に、Python に戻り、次のコマンドを使用してインストールされたパッケージをインポートします。 import
.
import pandas as pd
データのロード
データマイニングは、データ分析における最も重要なステップの XNUMX つです。 Python と R はどちらも、必要に応じて、ローカル ファイル、インターネットからのファイル、Web サイト、あらゆる種類のデータベースなど、あらゆるソースからデータを取得する広範な機会を提供します。
この記事全体を通じて、いくつかのデータセットを使用します。
- Google Analytics から XNUMX つのダウンロード。
- タイタニック号の乗客データセット。
すべてのデータは私の中にあります
R へのデータのロード: tinyverse、vroom、readr
データをライブラリにロードするには tidyverse
パッケージは XNUMX つあります。 vroom
, readr
. vroom
より現代的ですが、将来的にはパッケージが統合される可能性があります。
からの引用 vroom
.
ブルーム vs リーダー
のリリースは何ですかvroom
意味するreadr
? 今のところ、XNUMX つのパッケージを別々に進化させる予定ですが、将来的にはパッケージを統合する可能性があります。 vroom の遅延読み取りの欠点の XNUMX つは、特定のデータの問題を事前に報告できないことです。そのため、それらを統合する最善の方法については、少し考える必要があります。ブルーム対リーダー
リリースってどういう意味ですか?vroom
のためにreadr
? 現時点では両方のパッケージを個別に開発する予定ですが、将来的には統合する予定です。 怠惰な読書の欠点のXNUMXつはvroom
データに関する一部の問題は事前に報告できないため、それらをどのように組み合わせるのが最適かを考える必要があるということです。
この記事では、両方のデータ読み込みパッケージについて説明します。
R: vroom パッケージへのデータのロード
# install.packages("vroom")
library(vroom)
# Чтение данных
## vroom
ga_nov <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")
R:readrへのデータのロード
# install.packages("readr")
library(readr)
# Чтение данных
## readr
ga_nov <- read_tsv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec <- read_tsv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")
パッケージ内 vroom
csv/tsvデータ形式に関係なく、同名の関数でロードが行われます vroom()
、パッケージ内 readr
フォーマットごとに異なる関数を使用します read_tsv()
и read_csv()
.
R へのデータのロード: data.table
В data.table
データをロードする機能があります fread()
.
R: data.table パッケージへのデータのロード
# install.packages("data.table")
library(data.table)
## data.table
ga_nov <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")
Python でのデータのロード: pandas
R パッケージと比較すると、この場合の構文は次のように最も近くなります。 pandas
意志 readr
なぜなら pandas
どこからでもデータをリクエストでき、このパッケージには一連の関数が含まれています read_*()
.
read_csv()
read_excel()
read_sql()
read_json()
read_html()
さまざまな形式からデータを読み取るために設計されたその他の多くの関数。 しかし、私たちの目的にとってはそれで十分です read_table()
または read_csv()
引数を使用して 9月 列の区切り文字を指定します。
Python でのデータのロード: pandas
import pandas as pd
ga_nov = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_nowember.csv", sep = "t")
ga_dec = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_december.csv", sep = "t")
titanic = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/titanic.csv")
データフレームの作成
テーブル タイタニックロードすると、フィールドがあります 性別、乗客の性別識別子を保存します。
ただし、乗客の性別に関するデータをより便利に表示するには、性別コードではなく名前を使用する必要があります。
これを行うには、小さなディレクトリ、つまり 2 つの列 (コードと性別の名前) と 2 つの行のみが含まれるテーブルを作成します。
R でのデータフレームの作成: Tidyverse、dplyr
以下のコード例では、関数を使用して目的のデータフレームを作成します。 tibble()
.
R でのデータフレームの作成: dplyr
## dplyr
### создаём справочник
gender <- tibble(id = c(1, 2),
gender = c("female", "male"))
R でデータフレームを作成する: data.table
R でデータフレームを作成する: data.table
## data.table
### создаём справочник
gender <- data.table(id = c(1, 2),
gender = c("female", "male"))
Python でデータフレームを作成する: pandas
В pandas
フレームの作成はいくつかの段階で実行されます。最初に辞書を作成し、次に辞書をデータフレームに変換します。
Python でデータフレームを作成する: pandas
# создаём дата фрейм
gender_dict = {'id': [1, 2],
'gender': ["female", "male"]}
# преобразуем словарь в датафрейм
gender = pd.DataFrame.from_dict(gender_dict)
列の選択
作業するテーブルには、数十列、さらには数百列のデータが含まれる場合があります。 ただし、分析を実行するには、原則として、ソース テーブルで使用可能なすべての列は必要ありません。
したがって、ソーステーブルに対して実行する最初の操作の XNUMX つは、ソーステーブルから不要な情報を消去し、この情報が占有しているメモリを解放することです。
R での列の選択: tinyverse、dplyr
構文 dplyr
SQL クエリ言語に非常に似ているため、慣れていれば、このパッケージをすぐにマスターできるでしょう。
列を選択するには、関数を使用します select()
.
以下は、次の方法で列を選択できるコードの例です。
- 必要な列の名前をリストする
- 正規表現を使用して列名を参照する
- データ型または列に含まれるデータのその他のプロパティによる
R での列の選択: dplyr
# Выбор нужных столбцов
## dplyr
### выбрать по названию столбцов
select(ga_nov, date, source, sessions)
### исключь по названию столбцов
select(ga_nov, -medium, -bounces)
### выбрать по регулярному выражению, стобцы имена которых заканчиваются на s
select(ga_nov, matches("s$"))
### выбрать по условию, выбираем только целочисленные столбцы
select_if(ga_nov, is.integer)
R での列の選択: data.table
同じ操作を data.table
実行方法は少し異なります。記事の冒頭で、角括弧内の引数について説明しました。 data.table
.
DT[i,j,by]
ここで:
私 - どこ、つまり行によるフィルタリング
j - 選択|更新|実行、つまり列の選択と変換
by - データのグループ化
R での列の選択: data.table
## data.table
### выбрать по названию столбцов
ga_nov[ , .(date, source, sessions) ]
### исключь по названию столбцов
ga_nov[ , .SD, .SDcols = ! names(ga_nov) %like% "medium|bounces" ]
### выбрать по регулярному выражению
ga_nov[, .SD, .SDcols = patterns("s$")]
可変 .SD
すべての列にアクセスできるようになり、 .SDcols
正規表現を使用して必要な列をフィルタリングするか、必要な列の名前をフィルタリングするその他の関数を使用します。
Python、pandas での列の選択
列を名前で選択するには pandas
彼らの名前のリストを提供するだけで十分です。 また、正規表現を使用して名前で列を選択または除外するには、次の関数を使用する必要があります。 drop()
и filter()
、および引数 軸= 1を使用して、行ではなく列を処理する必要があることを示します。
データ型によってフィールドを選択するには、関数を使用します。 select_dtypes()
、そして引数に include または 除外する 選択する必要があるフィールドに対応するデータ型のリストを渡します。
Python での列の選択: pandas
# Выбор полей по названию
ga_nov[['date', 'source', 'sessions']]
# Исключить по названию
ga_nov.drop(['medium', 'bounces'], axis=1)
# Выбрать по регулярному выражению
ga_nov.filter(regex="s$", axis=1)
# Выбрать числовые поля
ga_nov.select_dtypes(include=['number'])
# Выбрать текстовые поля
ga_nov.select_dtypes(include=['object'])
行のフィルタリング
たとえば、ソース テーブルには数年分のデータが含まれている場合がありますが、分析する必要があるのは過去 XNUMX か月だけです。 繰り返しますが、余分な行があるとデータ処理プロセスが遅くなり、PC メモリが詰まります。
R での行のフィルタリング: tydyverse、dplyr
В dplyr
この関数は行をフィルタリングするために使用されます filter()
。 最初の引数としてデータフレームを受け取り、次にフィルタリング条件をリストします。
テーブルをフィルタリングするための論理式を作成する場合、この場合、引用符やテーブル名を宣言せずに列名を指定します。
複数の論理式を使用してフィルタリングする場合は、次の演算子を使用します。
- & またはカンマ - 論理 AND
- | - 論理和
R での行のフィルタリング: dplyr
# фильтрация строк
## dplyr
### фильтрация строк по одному условию
filter(ga_nov, source == "google")
### фильтр по двум условиям соединённым логическим и
filter(ga_nov, source == "google" & sessions >= 10)
### фильтр по двум условиям соединённым логическим или
filter(ga_nov, source == "google" | sessions >= 10)
R での行のフィルタリング: data.table
すでに上にも書きましたが、 data.table
データ変換構文は角かっこで囲まれています。
DT[i,j,by]
ここで:
私 - どこ、つまり行によるフィルタリング
j - 選択|更新|実行、つまり列の選択と変換
by - データのグループ化
引数は行をフィルタリングするために使用されます i、最初の位置が角かっこで囲まれています。
列には、引用符を使用せず、テーブル名を指定せずに、論理式でアクセスします。
論理式は次のように相互に関連しています。 dplyr
& および | 演算子を使用します。
R での行のフィルタリング: data.table
## data.table
### фильтрация строк по одному условию
ga_nov[source == "google"]
### фильтр по двум условиям соединённым логическим и
ga_nov[source == "google" & sessions >= 10]
### фильтр по двум условиям соединённым логическим или
ga_nov[source == "google" | sessions >= 10]
Python での文字列のフィルタリング: pandas
行でフィルタリング pandas
フィルタリングに似ています data.table
、角括弧内で行われます。
この場合、列へのアクセスは必ずデータフレームの名前を指定することによって実行されます。その後、列名を角かっこ内の引用符で囲むこともできます (例 df['col_name']
)、またはピリオドの後に引用符なし (例 df.col_name
).
複数の条件でデータフレームをフィルターする必要がある場合は、各条件を括弧で囲む必要があります。 論理条件は演算子によって相互に接続されます &
и |
.
Python での文字列のフィルタリング: pandas
# Фильтрация строк таблицы
### фильтрация строк по одному условию
ga_nov[ ga_nov['source'] == "google" ]
### фильтр по двум условиям соединённым логическим и
ga_nov[(ga_nov['source'] == "google") & (ga_nov['sessions'] >= 10)]
### фильтр по двум условиям соединённым логическим или
ga_nov[(ga_nov['source'] == "google") | (ga_nov['sessions'] >= 10)]
データのグループ化と集約
データ分析で最も一般的に使用される操作の XNUMX つは、グループ化と集計です。
これらの操作を実行するための構文は、レビューするすべてのパッケージに散在しています。
この場合、例としてデータフレームを取り上げます タイタニック、キャビンクラスに応じてチケットの枚数と平均コストを計算します。
R でのデータのグループ化と集約: Tidyverse、dplyr
В dplyr
この関数はグループ化に使用されます group_by()
、および集計用 summarise()
。 実際には、 dplyr
関数ファミリー全体が存在します summarise_*()
, ただし、この記事の目的は基本的な構文を比較することなので、そのようなジャングルには立ち入りません。
基本的な集計関数:
sum()
— 合計min()
/max()
– 最小値と最大値mean()
- 平均median()
— 中央値length()
- 量
R でのグループ化と集約: dplyr
## dplyr
### группировка и агрегация строк
group_by(titanic, Pclass) %>%
summarise(passangers = length(PassengerId),
avg_price = mean(Fare))
機能中 group_by()
最初の引数としてテーブルを渡しました タイタニック、フィールドを指定しました Pクラス、これによってテーブルをグループ化します。 演算子を使用したこの操作の結果 %>%
関数の最初の引数として渡されます summarise()
さらに 2 つのフィールドを追加しました。 乗客 и 平均価格。 まず、関数を使用して、 length()
チケットの数を計算し、XNUMX番目に関数を使用します mean()
チケットの平均価格を受け取りました。
R でのデータのグループ化と集計: data.table
В data.table
引数は集計に使用されます j
角括弧内の XNUMX 番目の位置とグループ化用 by
または keyby
、XNUMX番目の位置にあります。
この場合の集計関数のリストは、で説明されているものと同じです。 dplyr
、 なぜならこれらは基本的な R 構文の関数です。
R でのグループ化と集計: data.table
## data.table
### фильтрация строк по одному условию
titanic[, .(passangers = length(PassengerId),
avg_price = mean(Fare)),
by = Pclass]
Python でのデータのグループ化と集計: pandas
グループ化 pandas
に似ている dplyr
、ただし、集計は似ていません dplyr
全くない data.table
.
グループ化するには、次のメソッドを使用します groupby()
ここに、データフレームをグループ化する列のリストを渡す必要があります。
集計には次のメソッドを使用できます agg()
辞書を受け入れます。 ディクショナリ キーは集計関数を適用する列であり、値は集計関数の名前です。
集計関数:
sum()
— 合計min()
/max()
– 最小値と最大値mean()
- 平均median()
— 中央値count()
- 量
機能 reset_index()
以下の例では、ネストされたインデックスをリセットするために使用されています。 pandas
デフォルトはデータ集約後です。
シンボル 次の行に移動できます。
Python でのグループ化と集計: pandas
# группировка и агрегация данных
titanic.groupby(["Pclass"]).
agg({'PassengerId': 'count', 'Fare': 'mean'}).
reset_index()
テーブルの垂直結合
同じ構造の XNUMX つ以上のテーブルを結合する操作。 ロードしたデータにはテーブルが含まれています ガ_ノフ и ga_dec。 これらのテーブルの構造は同一です。 同じ列があり、これらの列のデータ型も同じです。
これは、XNUMX 月と XNUMX 月の Google Analytics からのアップロードです。このセクションでは、このデータを XNUMX つのテーブルに結合します。
R でのテーブルの垂直結合:tidyverse、dplyr
В dplyr
関数を使用すると、2 つのテーブルを XNUMX つに結合できます。 bind_rows()
、引数としてテーブルを渡します。
R での行のフィルタリング: dplyr
# Вертикальное объединение таблиц
## dplyr
bind_rows(ga_nov, ga_dec)
R でのテーブルの垂直結合: data.table
これも複雑なことではありませんので、使ってみましょう rbind()
.
R での行のフィルタリング: data.table
## data.table
rbind(ga_nov, ga_dec)
Python でのテーブルの垂直結合: pandas
В pandas
この関数はテーブルを結合するために使用されます concat()
を結合するには、フレームのリストを渡す必要があります。
Python での文字列のフィルタリング: pandas
# вертикальное объединение таблиц
pd.concat([ga_nov, ga_dec])
テーブルの水平結合
XNUMX 番目以降の列をキーによって最初のテーブルに追加する操作。 これは、ファクト テーブル (販売データを含むテーブルなど) を参照データ (製品のコストなど) で強化するときによく使用されます。
結合にはいくつかの種類があります。
以前にロードされたテーブル内 タイタニック コラムがあります 性別、これは乗客の性別コードに対応します。
1 - 女性
2 - 男性
また、表も作成しました - 参考書 性別。 乗客の性別に関するデータをより便利に表示するには、ディレクトリから性別の名前を追加する必要があります。 性別 テーブルへ タイタニック.
R での水平テーブル結合: tinyverse、dplyr
В dplyr
水平結合には一連の関数があります。
inner_join()
left_join()
right_join()
full_join()
semi_join()
nest_join()
anti_join()
私の練習で最もよく使われるのは、 left_join()
.
上記の関数は最初の XNUMX つの引数として、結合する XNUMX つのテーブルを受け取り、XNUMX 番目の引数として受け取ります。 by 結合する列を指定する必要があります。
R での水平テーブル結合: dplyr
# объединяем таблицы
left_join(titanic, gender,
by = c("Sex" = "id"))
R のテーブルの水平結合: data.table
В data.table
関数を使用してキーでテーブルを結合する必要があります merge()
.
data.table の merge() 関数の引数
- x, y — 結合するテーブル
- by — 両方のテーブルで同じ名前がある場合に結合するキーとなる列
- by.x、by.y — テーブル内で列名が異なる場合にマージされる列名
- all、all.x、all.y — 結合タイプ、all は両方のテーブルのすべての行を返します。all.x は LEFT JOIN 操作に対応します (最初のテーブルのすべての行を残します)、all.y — に対応します。 RIGHT JOIN 操作 (XNUMX 番目のテーブルのすべての行を残します)。
R のテーブルの水平結合: data.table
# объединяем таблицы
merge(titanic, gender, by.x = "Sex", by.y = "id", all.x = T)
Python での水平テーブル結合: pandas
同様に data.table
で pandas
この関数はテーブルを結合するために使用されます merge()
.
pandasのmerge()関数の引数
- どのように — 接続タイプ: 左、右、外側、内側
- on — 両方のテーブルで同じ名前を持つ場合にキーとなる列
- left_on、right_on — キー列の名前 (テーブル内でキー列の名前が異なる場合)
Python での水平テーブル結合: pandas
# объединяем по ключу
titanic.merge(gender, how = "left", left_on = "Sex", right_on = "id")
基本的なウィンドウ関数と計算列
ウィンドウ関数は集計関数と意味が似ており、データ分析でもよく使われます。 ただし、集計関数とは異なり、ウィンドウ関数は送信データフレームの行数を変更しません。
基本的に、ウィンドウ関数を使用して、受信データフレームを何らかの基準に従って部分に分割します。 XNUMX つまたは複数のフィールドの値によって異なります。 そして各ウィンドウで算術演算を実行します。 これらの操作の結果は各行で返されます。 テーブル内の行の合計数は変更されません。
たとえば、テーブルを考えてみましょう タイタニック。 各航空券のコストがそのキャビンクラス内で何パーセントであったかを計算できます。
これを行うには、各行で、この行のチケットが属する現在のキャビンクラスのチケットの合計コストを取得し、各チケットのコストを同じキャビンクラスのすべてのチケットの合計コストで割る必要があります。 。
R のウィンドウ関数: tinyverse、dplyr
行グループ化を使用せずに新しい列を追加するには、 dplyr
機能を果たす mutate()
.
データをフィールドごとにグループ化することで、上記の問題を解決できます。 Pクラス 新しい列のフィールドを合計します 運賃。 次に、テーブルのグループ化を解除し、フィールド値を分割します。 運賃 前のステップで起こったこと。
R のウィンドウ関数: dplyr
group_by(titanic, Pclass) %>%
mutate(Pclass_cost = sum(Fare)) %>%
ungroup() %>%
mutate(ticket_fare_rate = Fare / Pclass_cost)
R のウィンドウ関数: data.table
解決アルゴリズムは以前と同じです。 dplyr
、テーブルをフィールドごとにウィンドウに分割する必要があります Pクラス。 各行に対応するグループの金額を新しい列に出力し、グループ内の各チケットのコストの割合を計算する列を追加します。
新しい列を追加するには data.table
オペレーター在席 :=
。 以下はパッケージを使用して問題を解決する例です。 data.table
R のウィンドウ関数: data.table
titanic[,c("Pclass_cost","ticket_fare_rate") := .(sum(Fare), Fare / Pclass_cost),
by = Pclass]
Python のウィンドウ関数: pandas
新しい列を追加する XNUMX つの方法 pandas
- 機能を使用する assign()
。 行をグループ化せずにキャビンクラスごとに航空券のコストを集計するには、次の関数を使用します。 transform()
.
以下は、テーブルに追加するソリューションの例です。 タイタニック 同じ2列です。
Python のウィンドウ関数: pandas
titanic.assign(Pclass_cost = titanic.groupby('Pclass').Fare.transform(sum),
ticket_fare_rate = lambda x: x['Fare'] / x['Pclass_cost'])
関数とメソッドの対応表
以下は、私たちが検討したパッケージ内のデータに対してさまざまな操作を実行するメソッドの対応表です。
説明
きちんとした
データ表
パンダ
データのロード
vroom()
/ readr::read_csv()
/ readr::read_tsv()
fread()
read_csv()
データフレームの作成
tibble()
data.table()
dict()
+ from_dict()
列の選択
select()
議論 j、角かっこ内の XNUMX 番目の位置
必要な列のリストを角かっこで囲んで渡します / drop()
/ filter()
/ select_dtypes()
行のフィルタリング
filter()
議論 i、角括弧内の最初の位置
角括弧 / 内にフィルタリング条件をリストします。 filter()
グループ化と集約
group_by()
+ summarise()
議論 j + by
groupby()
+ agg()
テーブルの垂直結合 (UNION)
bind_rows()
rbind()
concat()
テーブルの水平結合(JOIN)
left_join()
/ *_join()
merge()
merge()
基本的なウィンドウ関数と計算列の追加
group_by()
+ mutate()
議論 j 演算子を使って :=
+ 引数 by
transform()
+ assign()
まとめ
おそらくこの記事では、データ処理の最適な実装について説明したわけではありません。そのため、コメントで私の間違いを修正していただければ、あるいは単に R / Python でデータを操作するための他のテクニックを使って記事に記載されている情報を補足していただければ幸いです。
上で書いたように、この記事の目的はどちらの言語が優れているかについて個人の意見を押し付けることではなく、両方の言語を学習する、または必要に応じて言語間を移行する機会を簡素化することです。
記事が気に入っていただけましたら、新しい購読者を獲得していただければ幸いです。
Опрос
仕事で使用しているパッケージは次のうちどれですか?
コメントに選択の理由を書くことができます。
登録ユーザーのみがアンケートに参加できます。
どのデータ処理パッケージを使用しますか (複数のオプションを選択できます)
-
視聴者の38%がきちんとしたバース19
-
視聴者の38%がデータ.テーブル14
-
視聴者の38%がパンダ23
42 人のユーザーが投票しました。 9名のユーザーが棄権した。
出所: habr.com