はじめに
deepblueインターン生の中山です。
【列追加、重複削除、列名変更、結合、集約】PythonとRのデータフレーム操作比較 vol.2 の続きの記事です。
連載
・【読み込み、要約統計量、行・列選択、代入】PythonとRのデータフレーム操作比較 vol.1
・【列追加、重複削除、列名変更、結合、集約】PythonとRのデータフレーム操作比較 vol.2
・【集計、ソート、縦持ち・横持ち変換】PythonとRのデータフレーム操作比較 vol.3
・【列分割・NA操作・サンプリング】PythonとRのデータフレーム操作比較 vol.4
・【train/test分割】PythonとRのデータフレーム操作比較 vol.5
使ったデータ
使ったデータは、MineThatData E-Mail Analytics And Data Mining Challenge datasetです。
前回のblogとデータは同じです。
historyを3000以上に条件付けている事が多いですが、データ数を減らして確認しやすくしているだけで、深い意味はないです。
データ読み込み
csvデータを読み込むコード。
tailで行末を確認しています。
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.tail()
R
library(tidyverse)
PATH <- 'http://www.minethatdata.com/Kevin_Hillstrom_MineThatData_E-MailAnalytics_DataMiningChallenge_2008.03.20.csv'
df <- read.csv(PATH)
tail(df)
グループ分けした時の要約統計量
グループ分けを行い、欲しい列を抽出した時の、要約統計量を算出するコード。
今回は、平均値と最大値を算出するコードにしました。
Python | R |
groupby | group_by |
agg | funs |
[['hoge', 'fuga']] | summarize_each |
Python
df_new = df.groupby(['channel','zip_code']).agg(['mean','max'])
df_new = df_new[['recency','history','spend']]
R
df.new <- df %>%
group_by(channel, zip_code) %>%
summarise_each(funs(mean, max),
recency, history, spend)
データのソート
列を選択し、データのソートをするコード。
どちらも昇順になっています。
Python | R |
sort_values | arrange |
Python
df_new = df[df.history > 3000]
df_new = df_new.sort_values(['history'])
R
df.new <- df %>%
filter(history > 3000) %>%
arrange(history)
行番号を列に追加
データの1列目に、元データの行番号を追加するコード。
元の行番号を列に追加して、indexを振り直しています。
Python | R |
insert(0,'id',df.index) | rowid_to_column('id') |
Python
df_new = df.copy()
df_new.insert(0,'id',df_new.index)
df_new = df_new[df_new.history > 3000]
df_new = df_new.reset_index(drop=True)
R
df.new <- df %>%
rowid_to_column('id') %>%
filter(history > 3000)
データの縦持ち
複数列のデータを1列にするコード。
id列・変数名列・変数列の3つのデータに変更しています。
Python、Rともに同じ結果になるようにしています。
Python | R |
stack | gather |
Python
df_vertical = df[df.history > 3000]
df_vertical = pd.DataFrame(df_vertical.stack())
df_vertical = df_vertical.rename(columns={0:'values'})
df_vertical.index.names = ['id', 'keys']
df_vertical
R
df.vertical <- df %>%
rowid_to_column('id') %>%
filter(history > 3000) %>%
gather(key = keys, value = values, -id) %>%
arrange(id)
縦持ちの横持ち化
上記でstack及びgatherで縦持ちにしたデータを横持ちに戻すコード。
Python | R |
stack | gather |
unstack | spread |
Python
df_horizontal = df_vertical.unstack()
ただ、columnが2行になってしまうので、以下のようにすると元に戻ります。
cols = [v2 for v1, v2 in df_horizontal.columns.values]
df_horizontal.columns = cols
R
df.horizontal <- df.vertical %>%
spread(key = keys, value = values)
連載
・【読み込み、要約統計量、行・列選択、代入】PythonとRのデータフレーム操作比較 vol.1
・【列追加、重複削除、列名変更、結合、集約】PythonとRのデータフレーム操作比較 vol.2
・【集計、ソート、縦持ち・横持ち変換】PythonとRのデータフレーム操作比較 vol.3
・【列分割・NA操作・サンプリング】PythonとRのデータフレーム操作比較 vol.4
・【train/test分割】PythonとRのデータフレーム操作比較 vol.5
(著:中山 翔太)
関連記事
Deepblueでは統計やAIの平和的活用を一緒に取り組んでいただける方を募集してます。詳しくはRecruitをご覧ください。