Python/R/SQL コード対応表

この記事は、こんな悩みを持っている方に向けて書いています。

  • いつもSQLでやってるあの処理をPythonでやりたい
  • いつもPythonでやってるあの処理をRでやりたい
  • いつもRでやってるあの処理をSQLでやりたい

コードを書いている時、上記のようなことをよく思っていたので、Python・R・SQLのコード対応表を作りました。

随時、追加・修正していく予定なので、ぜひブックマークしてみてください。

コード対応表

Python R SQL(BigQuery)
レコードをn件だけ表示 df.head(n) head(df, n) LIMIT n
レコード数を確認 len(df) nrow(df) COUNT(*)
ユニークカウント nunique(df['列A']) n_distinct(列A) COUNT(DISTINCT 列A)
列を追加 df['列A'] = 値 mutate(df, 列A = 値) SELECT 値 AS 列A
集約 df.groupby('列A') group_by(df, 列A) GROUP BY 列A
外部結合 pd.merge(df1, df2, how='left', on='列A') left_join(df1, df2, by='列A') LEFT JOIN table
内部結合 pd.merge(df1, df2, how='inner', on='列A') inner_join(df1, df2, by='列A') INNER JOIN table
NULLを無視して平均を求める df['列A'].mean(skipna=True) mean(列A, na.rm = TRUE) AVG(列A)
列Aでダミー変数化 pd.get_dummies(df, columns=['列A']) dummyVars(~列A, data=df) ダミー変数ごとにSELECT句に列を追加
列Aを標準化 scaler = StandardScaler()
df['列A'] = scaler.fit_transform(df[['列A']])
scale(列A) -
列Aを正規化 mm = MinMaxScaler()
df['列A'] = mm.fit_transform(df[['列A']])
scale(列A, center = min(列A),
scale = max(列A) - min(列A))
-
常用対数変換 log10(df['列A'] + 1) log10(列A + 1) LOG10(列A)
自然対数変換 log(df['列A'] + 1) log(列A + 1) LN(列A)
切り捨て np.floor(x) trunc(x) FLOOR(列A)
切り上げ np.ceil(x) ceiling(x) CEIL(列A)
四捨五入(Python, Rは偶数丸め) np.round(x) round(x) ROUND(列A)
列Aをstring型に変換 df['列A'].astype('str') as.character(列A) CAST(列A AS STRING)
文字列をdatetime型に変換 pd.to_datetime(df['列A']) strptime(列A, '%Y%m%d') PARSE_DATE('%Y%m%d', 列A)
datetimeをエポック秒に変換 列A.timestamp() as.numeric(strptime(as.character(列A), '%Y%m%d')) UNIX_SECONDS(列A)
月数の差を求める relativedelta(x[0], x[1]).years * 12
+ relativedelta(x[0], x[1]).months
trunc(time_length(interval(列A, 列B), "month") DATETIME_DIFF(列A, 列B, MONTH)
年数の差を求める relativedelta(x[0], x[1]).years trunc(time_length(interval(列A, 列B), "year") DATETIME_DIFF(列A, 列B, YEAR)
当該週の月曜日を求める df['列A'].apply(lambda x:
x - relativedelta(days=x.weekday()))
as.Date(floor_date(strptime(as.character(列A),
'%Y%m%d') - 1 , unit="week")) + 1)
-
四分位点を全て求める qcut(df['列A'], 4) quantile(列A) -
第一四分位点を求める df['列A'].quantile(0.25) quantile(列A)[2] PERCENTILE_CONT(列A, 0.25) OVER( )
各項目の欠損確認 df.isnull().sum() sapply(df, function(x) sum(is.na(x))) COUNT(CASE WHEN 列A IS NULL THEN 1 ELSE 0 END)
欠損をひとつでも含むレコードを削除 df.dropna(how='any') na.omit(df) -
欠損を0埋めする df.fillna(0) replace_na(replace=list(列A = 0) IFNULL(列A, 0)
上限値を設定 apply(lambda x: min(x, 上限値)) mutate(列名 = pmin(列A, 上限値)) MIN(列A, 上限値)
複数列の文字列を結合 df['列A'] + df['列B'] paste(列A, 列B, sep="_") CONCAT(列A, 列B)
条件に応じてフラグを振る df['列A'].map({'条件1': 'フラグ1,...}) case_when(条件1 ~ フラグ1, ... CASE WHEN 条件1 THEN フラグ1
10%をランダムサンプリング sample(frac=0.1) sample_frac(df, 0.1) -
列Aで層別サンプリング _, df_tmp = train_test_split(df, test_size=0.1,
stratify=df['列A'])
group_by(列A) %>% sample_frac(., 0.1) -
IQRを求める df['列A'].quantile(0.75) - df['列A'].quantile(0.25) IQR(列A) PERCENTILE_CONT(列A, 0.75) OVER( )
- PERCENTILE_CONT(列A, 0.25) OVER( )