はじめに
こんな人向け
・Rは分かるけど, Pythonは分からないという人向け.
背景
・R初心者(初稿投稿時: R歴7ヶ月).
・最近Pythonにも手を出してみるも, 単純なデータ処理すら書き方がRと異なるため難しい.
・RとPythonのデータ処理の対応表を見たい.
・いくつか参考サイトあるが, 自分が必要とするものが完全に揃っているわけではない.
=>R vs Python:データ解析を比較
・じゃあ自分用メモを作っちゃおう.
参考にしたサイト
- 【Python】
- Python Pandasでのデータ操作の初歩まとめ − 前半:データ作成&操作編
- ゆるふわPandasチートシート
- 『Pythonによるデータ分析入門』
- Python文字列操作マスター
- pandasの使い方(merge、join、concat編)
基本操作(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()