はじめに

deepblueインターン生の中山です。
【集計、ソート、縦持ち・横持ち変換】PythonとRのデータフレーム操作比較 vol.3 の続きの記事です。

連載

【読み込み、要約統計量、行・列選択、代入】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以上に条件付けている事が多いですが、データ数を減らして確認しやすくしているだけで、深い意味はないです。

データ読み込み

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)

R

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

列の分割

列を分割するコード。
history_segmentとsegmentの分割を行いました。
hitory_segmentの方はエスケープの問題がありますが、説明は割愛します。

PythonR
str.split().tolist()separate()

Python

df1 = pd.DataFrame(df.history_segment.str.split('\) ').tolist(), columns=['hs1','hs2'])
df2 = pd.DataFrame(df.segment.str.split().tolist(), columns=['seg1','seg2'])
df_new = pd.concat([df,df1,df2],axis=1)
df_new = df_new.drop(['history_segment','segment'], axis=1)

R

df.new <- df %>% 
  separate(history_segment, c('hs1','hs2'), "[)] ") %>% 
  separate(segment, c('seg1','seg2'), ' ')

NAの削除

NAの削除をするコード
dataframeの中にNAがある時に行削除をするコードです。
コードの前半では敢えて、上で説明した列の分割を利用してNAを作っています。
行数が64000から、62692になっていることも確認できると思います。

PythonR
dropna()drop_na()

Python

df1 = pd.DataFrame(df.history_segment.str.split().tolist(), columns=['hs1','hs2','hs3','hs4'])
df_new = pd.concat([df,df1],axis=1)
df_new = df_new.drop('history_segment', axis=1)
df_new = df_new.dropna()
print(len(df)) # 64000
print(len(df_new)) # 62692 

R

df.new <- df %>% 
  separate(history_segment, c('hs1','hs2','hs3','hs4'), ' ', convert=T) %>%
  drop_na()
nrow(df) # 64000
nrow(df.new) # 62692

NAの置換

NAの削除をするコード
NAを作り出すところまでは上と同様です。
上記ではNAの削除を行っていますが、似たようなコードで、NAを埋めることもできます。

PythonR
fillna(value={col:val})fillna(list(col=val))

Python

df1 = pd.DataFrame(df.history_segment.str.split().tolist(), columns=['hs1','hs2','hs3','hs4'])
df_new = pd.concat([df,df1],axis=1)
df_new = df_new.drop('history_segment', axis=1)
df_new = df_new.fillna(value={'hs4':'$1000'})
print(len(df)) # 64000
print(len(df_new)) # 64000

R

df.new <- df %>% 
  separate(history_segment, c('hs1','hs2','hs3','hs4'), ' ', convert=T) %>%
  replace_na(list(hs4='$1000'))
nrow(df) # 64000
nrow(df.new) # 64000

サンプリング

行のサンプリングをするコード。
行の中でいくつかのデータを抽出します。
やり方は主に2種類あり、
- 抽出する個数を選択する
- 抽出する割合を選択する
のどちらかです。

PythonR
sample(N)sample_n(N)
sample(frac=p)sample_frac(p)

Python

df.sample(64) # 個数
df.sample(frac=0.001) # 割合

R

df.new <- df %>% 
  sample_n(64) # 個数
df.new <- df %>% 
  sample_frac(0.001) # 割合

連載

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

(著:中山 翔太

関連記事