42
50

More than 5 years have passed since last update.

Rユーザー向け Pythonデータ処理入門

Last updated at Posted at 2017-10-19

はじめに 

こんな人向け

・Rは分かるけど, Pythonは分からないという人向け.

背景

・R初心者(初稿投稿時: R歴7ヶ月).
・最近Pythonにも手を出してみるも, 単純なデータ処理すら書き方がRと異なるため難しい.
・RとPythonのデータ処理の対応表を見たい.
・いくつか参考サイトあるが, 自分が必要とするものが完全に揃っているわけではない.
 =>R vs Python:データ解析を比較
・じゃあ自分用メモを作っちゃおう.

参考にしたサイト




基本操作(base)

・irisデータセットを使用.
・ちょこちょこ余計な操作もしています.

行・列数を確認

R
dim(iris)
py
iris.shape

行数を確認

R
nrow(iris)
py
len(iris)

列数を確認

R
ncol(iris)
py
len(iris.columns)

データ型確認

R
class(iris)
R
class(iris$Sepal.Length)
py
type(iris)
py
type(iris.Species)

先頭のn行を確認

R
head(iris)
py
iris.head()

列名を確認

R
names(iris)
py
iris.columns

指定行の取り出し

R
iris[1,]
py
iris.iloc[0] # 行番号を使って行抽出

指定列の取り出し

R
head(iris[,1])
py
iris["Sepal.Length"].head()

行結合

R
iris2 = iris
dim(rbind(iris, iris2))
py
iris2 = iris
pd.concat([iris, iris2],axis=0).shape # axis=0は省略可能

列結合

R
iris2 = iris
head(cbind(iris, iris2))
py
iris2 = iris
pd.concat([iris, iris2],axis=1).head() # axis=1は省略不可

文字列型ー>数値型

R
c = "1"
class(as.numeric(c))
py
c = "1"
type(float(c))

数値型ー>文字列型

R
v = 1
class(as.character(v))
py
f = 1
type(str(f))

統計要約量

R
summary(iris)
py
iris.describe()
# 件数、平均、標準偏差、最小値、最大値、中央値、四分位数

欠損値を含む行を削除

R
iris.na <- iris %>% mutate(column.na=seq(1:nrow(iris))) #nrow()は行数を返す。seqは順に任意の数(デフォルト1)ずつ増減する数列を返す。
iris.na[1,6] <- NA # "<-" は代入記号
head(na.omit(iris.na))
py
series = pd.Series(range(150), index=new_iris.index) #index付きのシリーズ作成。indexは元のdfのindex(=行番号)
del series[0] # 要素の削除(del文, popメソッド, removeメソッド) https://www.pythonweb.jp/tutorial/list/index8.html
iris_na = iris
iris_na["column_na"] = series
iris_na.dropna(axis=0).head()


データ操作(dplyr)

rename

R
new_colnames <- stringr::str_replace(colnames(iris), "[.]", "_") # "."を"_"に変換する
new_iris <- iris
colnames(new_iris) <- new_colnames
# df %>% rename(new_colname = old_colname) とすることもできる。
names(new_iris)
py
rename_dict = {column: column.replace('.', '_') for column in iris.columns} # 列名の"."を"_"に書き換える
new_iris = iris.rename(columns=rename_dict)
new_iris.columns

filter

R
head(iris %>% filter(Sepal.Length > 6.4))
py
new_iris[(new_iris['Sepal_Length'] > 5) & (new_iris['Sepal_Width'] > 3)].head()
# データフレーム[Booleanの配列を入れる]
# 複数条件の場合は、or条件の "|" もしくは and条件の "&"を間に入れ、それぞれの条件を()で囲む

select

  • 列名で列選択
R
head(iris %>% select(Sepal.Length))
py
new_iris[["Sepal_Length", "Petal_Length"]].head() # 複数列選択([]で[列名,列名]を囲む)  
  • 列番号で列選択
R
head(iris %>% select(-1))
py
new_iris.drop('Species', axis=1).head(6) # 列削除

mutate

R
head(iris %>% mutate(new.column="new value"))
py
series = pd.Series("new_value", index=new_iris.index) # index付きのシリーズ作成。indexは元のdfのindex(=行番号)
new_iris["new_column"]=series
new_iris.head()

arrange

  • デフォルトでは昇順
R
head(iris %>% arrange(Sepal.Length))
py
new_iris.sort_values(by=['Sepal_Length', 'Sepal_Width']).head() # 複数の値で昇順でソート
  • desc()で降順にもできる
R
head(iris %>% arrange(desc(Sepal.Length)))
py
new_iris.sort_values(by='Sepal_Length', ascending=False).head() # 降順でソート

group_by

R
head(
knitr::kable(iris %>% 
       arrange(Sepal.Width) %>% 
       group_by(Species) %>% 
       mutate(mean.S.L.by.Species=mean(Sepal.Width)))
)
py
new_iris_grouped = new_iris.groupby("Species")  # SpeciesでGroup_byを行う。
new_iris_grouped[["Sepal_Length","Sepal_Width"]].mean()          
  # Group化されたされたオブジェクトに対してMeanを行う。
  # 必要であれば、Meanを行う変数を指定できる。

summarise

R
head(iris %>% summarise(max.sl=max(Sepal.Length), 
                        max.sw=max(Sepal.Width), 
                        min.pl=min(Petal.Length), 
                        mean.pw=mean(Petal.Width)))
py
# 同上
new_iris_grouped = new_iris.groupby("Species")  # SpeciesでGroup_byを行う。
new_iris_grouped[["Sepal_Length","Sepal_Width"]].mean()          
  # Group化されたされたオブジェクトに対してMeanを行う。
  # 必要であれば、Meanを行う変数を指定できる。

join

R
colnames_for_join <- stringr::str_replace(colnames(iris), "th", "th_for_join") # 列名の"*th"を"*th_for_join"に書き換える
iris_for_join <- iris 
colnames(iris_for_join) <- colnames_for_join
iris %>% left_join(iris_for_join, by="Species")
py
dict_for_join = {column: column.replace('th', 'th_for_join') for column in new_iris.columns}
iris_for_join = new_iris
iris_for_join = iris_for_join.rename(columns=dict_for_join)
pd.merge(new_iris, iris_for_join, how='left')


文字列処理(stringr)

データ読み込み

R
species <- iris$Species
species[1]
py
species = new_iris["Species"]
species[0]

str_length: 文字列の長さを返す.

R
str_length(species[1])
py
len(species[0])

str_sub: 文字列の一部抽出する.

R
str_sub(species[1], start = 1, end = 4)
R
str_sub(species[1], start = -4, end = -1)
py
species[0][0:2]
py
species[0][-2:]

str_detect: 特定のパターンを文字列が含むかどうか判別する.

R
str_detect(species[1], "eto")
py
"eto" in species[0]

str_subset: 特定のパターンを含む文字列を抽出する.

R
str_subset(species, "set")
py
for index in range(1,len(species)): 
    if ("set" in species[index]) ==True:
        print(species[index])

str_locate: 特定のパターンが文字列の何番目に位置するかを返す.

R
str_locate(species[1], "set")
py
species[0].find("t")

str_replace: 文字列内の特定のパターンを置換する.

R
str_replace(species[1], "sa", "sa_replaced")
py
species[0].replace("sa", "sa_replaced")

str_trim: 文字列の空白を除去する.

R
species_trim <- c(" species ")
str_trim(species_trim, side="both")
py
species_trim = (" species ")
species_trim.strip()
# lstripはstripと同等の処理を左端のみに適用
# rstripはstripと同等の処理を右端のみに適用


その他

readr::parse_number: 数字のみを抽出する.

R
x <- c("6e23")
parse_number(x)
py
import re
x = ("6e23")
re.match("\d", x).group()
42
50
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
50