はじめに

deepblueインターン生の中山です。
【列追加、重複削除、列名変更、結合、集約】PythonとRのデータフレーム操作比較 vol.2 の続きの記事です。

連載

【読み込み、要約統計量、行・列選択、代入】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データを読み込むコード。
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)

グループ分けした時の要約統計量

グループ分けを行い、欲しい列を抽出した時の、要約統計量を算出するコード。
今回は、平均値と最大値を算出するコードにしました。

PythonR
groupbygroup_by
aggfuns
[['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)

データのソート

列を選択し、データのソートをするコード。
どちらも昇順になっています。

PythonR
sort_valuesarrange

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を振り直しています。

PythonR
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ともに同じ結果になるようにしています。

PythonR
stackgather

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で縦持ちにしたデータを横持ちに戻すコード。

PythonR
stackgather
unstackspread

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

(著:中山 翔太

関連記事