はじめに

deepblueインターン生の中山です。
【読み込み、要約統計量、行・列選択、代入】PythonとRのデータフレーム操作比較 vol.1 の続きの記事です。
今回はRのtidyverseを用いた時のPythonと比較をしたいと思います。

連載

【読み込み、要約統計量、行・列選択、代入】PythonとRのデータフレーム操作比較 vol.1
【列追加、重複削除、列名変更、結合、集約】PythonとRのデータフレーム操作比較 vol.2
【集計、ソート、縦持ち・横持ち変換】PythonとRのデータフレーム操作比較 vol.3
【列分割・NA操作・サンプリング】PythonとRのデータフレーム操作比較 vol.4

使ったデータ

使ったデータは、MineThatData E-Mail Analytics And Data Mining Challenge datasetです。
前回のblogとデータは同じです。
historyを3000以上に条件付けている事が多いですが、データ数を減らして確認しやすくしているだけで、深い意味はないです。

データ読み込み

csvデータを読み込むコード。
headで10個確認しています。

Python

import pandas as pd
PATH = 'http://www.minethatdata.com/Kevin_Hillstrom_MineThatData_E-MailAnalytics_DataMiningChallenge_2008.03.20.csv'
df = pd.read_csv(PATH)
df.head(10)

R

library(tidyverse)
PATH <- 'http://www.minethatdata.com/Kevin_Hillstrom_MineThatData_E-MailAnalytics_DataMiningChallenge_2008.03.20.csv'
df <- read.csv(PATH)
head(df, 10)

vol.1でやった事

前回のblogの後半部分で扱った内容を1つにまとめます。
列の選択、行の抽出、値の置換の3つです。

Python

df_new = df[['recency', 'history', 'zip_code', 'channel', 'spend']]
df_new = df_new[df_new.history > 3000].assign(spend=1000)

R

df.new <- df %>% 
  select(recency, history, zip_code, channel, spend) %>% 
  filter(history > 3000) %>% 
  mutate(spend = 1000)

列追加

新たな列を追加するコード。
上記では、データの置換を行ったが、新たな列を追加する。

Python

df_selected = df[['recency', 'history', 'zip_code', 'channel', 'spend']]
df_selected = df_selected[df_selected.history > 3000]
df_new = df_selected.copy()
df_new['col'] = df_new.apply(lambda x: x.recency * x.history, axis=1)
# df_new['col'] = df_new.recency * df_new.history # これでも可

R

df.selected <- df %>% 
  select(recency, history, zip_code, channel, spend) %>% 
  filter(history > 3000)
df.new <- df.selected %>% 
  mutate(col = recency*history)

重複削除

dataframeの重複を削除するコード。

Python

df_new = df.channel.drop_duplicates()

R

df.new <- df %>%
  distinct(channel)

列名変更

列名を変更するコード。
PythonとRで書く順番が違うので注意が必要です。

Python

df_new = df.rename(columns={'recency':'RECENCY'})

R

df.new <- df %>% 
  rename(RECENCY = recency)

データの列結合

dataframeを列どうしで結合するコード。

Python

df1 = df[['recency', 'history', 'zip_code']]
df2 = df[['channel', 'spend']]
df_new =pd.concat([df1, df2], axis=1)

R

df1 <- df %>% 
  select(recency, history, zip_code)
df2 <- df %>% 
  select(channel, spend)
df.new <- df1 %>% 
  bind_cols(df2)

データの行結合

dataframeを行どうしで結合するコード。

Python

df1 = df[df.history > 3000]
df2 = df[df.history == 30]
df_new =pd.concat([df1, df2], axis=0)

R

df1 <- df %>% 
  filter(history > 3000)
df2 <- df %>% 
  filter(history == 30)
df.new <- df1 %>% 
  bind_rows(df2)

データの集約

groupbyでデータを分けて全列の平均値を算出するコード。

Python

df.groupby('channel').mean()

R

df.new <- df %>% 
  group_by(channel) %>% 
  summarise_all(funs(mean))

連載

【読み込み、要約統計量、行・列選択、代入】PythonとRのデータフレーム操作比較 vol.1
【列追加、重複削除、列名変更、結合、集約】PythonとRのデータフレーム操作比較 vol.2
【集計、ソート、縦持ち・横持ち変換】PythonとRのデータフレーム操作比較 vol.3
【列分割・NA操作・サンプリング】PythonとRのデータフレーム操作比較 vol.4

(著:中山 翔太

関連記事