Python pandasとR言語の基本操作チートシート
はじめに
本格的なデータ解析をする場合は専用のシステムを利用することが多いと思う。
ちょっと手元のPCでデータを確認したいときに使うのがPythonのpandasやR言語だ。
ここではpandasとR言語の基本的な使い方を対比するような形で紹介していく。
なお、グラフ作成まで含めると超長文になってしまうので本記事には含めていない。
pandas
pandasはデータ解析を支援するPythonライブラリだ。
データ解析に必要な基本機能を一通り具備しているだけでなく、Pythonという汎用言語の各種機能を活用して様々な状況に柔軟に対応できる点が専用言語にはないメリットだ。
グラフを作成する場合はmatplotlib等、他のライブラリを利用する必要がある。
R
Rはデータ解析専用言語で、いくつかあるデータ解析専用言語の中では特に人気が高い。
きれいなグラフを作成することもできる。
Rでは素のRを直接利用せず、tidyverseという外部ライブラリを利用することが一般的になっている。
素のRをbase RやR base呼び、base Rとtidyverseでは同じことを実現する上でも書き方が異なる。
base Rの例
View(sort(table(df$hair_color), decreasing = TRUE))
同じことをtidyverseで実現した例
df %>% select(hair_color) %>% count(hair_color) %>% arrange(desc(n)) %>% view()
本記事では基本的にtidyverseを使った方式を採用している。
Pythonのような汎用性はないが、簡単なユースケースであれば非常に少ない行数で実現できるため、プログラミング未経験者にも優しいが、複雑なことをやろうとするとそれなりに複雑なコードを記述することになる。
各種ライブラリを活用すればpandasとほぼ同じようなことができる。
どちらを使うべきか
データのプロを目指すなら両方使えた方がよいだろう。
現場でどちらか片方が採用されていればそれを使えばよい。
どちらにも当てはまらない場合はどちらを使ってもよいがとりあえず汎用性の高いPython + pandasを使い、必要になったらRも学習するのが無難かと思う。
片方を学習すればもう片方を理解するのも容易になる。
Reference
pandas
https://pandas.pydata.org/pandas-docs/stable/reference/index.html
R
R Reference
https://cran.r-project.org/doc/manuals/r-release/R-intro.html#References
tidyverse Reference
https://tidyverse.tidyverse.org/index.html
Usageの項を参照
環境
pandas
- JupyterLab
- VSCode
- PyCharm
R
- RStudio
Import
pandas
import pandas as pd
R - tidyverse
library("tidyverse")
入出力
ファイルの読み込み
pandas
df = pd.read_csv("ファイルパス")
R
library(readr)
df <- read_csv("ファイルパス")
- RStudioの「Import Dataset」でプレビュー画面を見ながら取り込み設定を決めて「Code Preview」欄からコピペするとよい
ファイルの書き込み
pandas
df.to_csv("ファイルパス", index=False)
R
write.csv(df, "ファイルパス")
データフレーム全体の確認
データフレームサイズ
pandas
df.shape
R
df %>% dim()
型
pandas
df.info()
R
df %>% glimpse()
- 多くの場合、
df %>% str()より見やすい
統計情報
pandas
df.describe()
R
df %>% summary()
全体表示
pandas
df
R
df %>% view()
画面に表示される行数/列数を増やす
pandas
pd.set_option('display.max_rows', 100)
pd.set_option('display.max_columns', 40)
R
print(n = 100, df)
欠損値処理
ある列が欠損している行
pandas
df.query("列名.isna()")`
R
df %>% filter(is.na(列名))
- Rは基本的に列名を
""で囲む必要なし
ある列が欠損していない行
pandas
df.query("列名.notna()")
R
df %>% filter(!is.na(列名))
いずれかの列に欠損値を含む行
pandas
df[df.isna().any(axis=1)]
R
df %>% filter(!complete.cases(.))
complete.casesは欠損値がない行.はthis dataset
欠損値のある行を削除
pandas
df.dropna(subset=["列名"])
R
df %>% drop_na(列名)
欠損値を置換
pandas
df.fillna(value={"列名1": "置換文字1", "列名2": "置換文字2"})
R
df %>% replace_na(list(列名1 = 置換文字1, 列名2 = 置換文字2))
欠損値をpadding
pandas
df.ffill() df.bfill()
R
df %>% fill(列名, .direction = "up|down")
データ閲覧
列を絞る
pandas
df.filter(items = ["列名1", "列名2"])
R
df %>% select(列名1, 列名2, ends_with("列名に含まれる文字列"))
ends_with以外にcontains,starts_withなども利用できる
検索
pandas
df.query("species == 'Human'")
R
df %>% filter(species == "Human")
- その他の
filterの条件の例Age > 24 & Height > 1.78gender %in% c("male", "female")!sleep > 18near(sleep_total, 17 tol = 0.5)
ソート
pandas
df.sort_values("列名", ascending=True|False)
R
df %>% arrange(列名) df %>% arrange(-列名)
重複削除
pandas
drop_duplicates("列名")
R
df %>% distinct(列名)
変更/変換
列名の変更
pandas
df.rename(columns={"変更前": "変更後"})
R
df %>% rename(変更後 = 変更前)
新しい列の作成
pandas
df.assign(列名 = ラムダ式)
- 列名を
""で囲まない
R
df %>% mutate(列名 = 式)
型変換
pandas
df.apply(列名 = df["列名"].astype("str"))
R
df %>% mutate(列名 = as.character(列名))
集計
pandas
df.groupby("列名").max()
min()、mean()についても同様
R
df %>%
group_by(列名) %>%
summarize(Lower = min(sleep_total),
Average = mean(sleep_total),
Upper = max(sleep_total))
結合
Join
pandas
df_left.merge(df_right, on="キー", how="left")
R
df_left %>% left_join(df_right, by=c("左キー" = "右キー"))
縦結合
pandas
pd.concat([df1, df2], axis=0, ignore_index=True)
R
df1 %>% bind_rows(df2)
横結合
pandas
pd.concat([df1, df2], axis=1)
R
df1 %>% bind_cols(df2)
縦横変換
long data -> wide data
pandas
df.pivot(columns="欄にする列名", values="値にする列名")
R
data %>% pivot_wider(names_from = 欄にする列名, values_from = 値にする列名)
wide data -> long data
pandas
df.melt(id_vars="残す列名",
value_vars=["縦にする欄名1", "縦にする欄名2"],
var_name="欄名1,2を集めた列の名",
value_name="値を集めた列の名")
R
wide_data %>%
pivot_longer(対象範囲,
names_to = "欄名を集めた列の名",
values_to = "値を集めた列の名")
Downsample
pandas
df.resample()
R
- 苦手?
反復処理
pandas
df.apply()
R
purr::map
文字列操作
pandas
Series.str
R
stringr
可視化
pandas
- matplotlib
R
ggplot2