1. メソッドチェーン内で自分自身を参照したい。
メソッドチェーン内で自分自身を参照したいことは多い。
メソッドチェーン内で新規の変数をいくつか作成していて、後続処理でその変数を参照したい。
私はデータ加工処理をできるだけ一つのメソッドチェーンで実装したいので自分自身を参照できる方法はとても大事。
pandas.DataFrameではpipeメソッドを使用して実現できる。
今回はpyspark.sql.DataFrameで自分自身を参照する方法を整理します。
2. pyspark.sql.DataFrame.transform
結論としてはtransformメソッドで自分自身を参照できます。
transformというのが紛らわしいです。
pandas.DataFrame.transformはpysparkのtransformとは全く違う処理です。
pandas.DataFrame.transformの使い方は当ブログでも一度取り上げています。
pandas使用時とpyspark使用時にpipeなのかtransformなのか混乱してしまいそうです。
3. 実例
コードを用いて実例を示します。
3.1. データ準備
今回もsklearnのbostonデータセットを使用します。
import re
import pandas as pd
from sklearn.datasets import load_boston
data = load_boston()
boston_pdf = pd.DataFrame(
data.data,
columns=data.feature_names
)
boston_sdf = spark.createDataFrame(
boston_pdf
)
ouput
In [3]: boston_sdf.printSchema()
root
|-- CRIM: double (nullable = true)
|-- ZN: double (nullable = true)
|-- INDUS: double (nullable = true)
|-- CHAS: double (nullable = true)
|-- NOX: double (nullable = true)
|-- RM: double (nullable = true)
|-- AGE: double (nullable = true)
|-- DIS: double (nullable = true)
|-- RAD: double (nullable = true)
|-- TAX: double (nullable = true)
|-- PTRATIO: double (nullable = true)
|-- B: double (nullable = true)
|-- LSTAT: double (nullable = true)
3.2. transformを使用して自分自身を参照する
自分自身の列名を参照して列名の最後がSで終了する列を正規表現を使用して選択してみます。
transform内ではlambda式を使用します。
exmaple.py
selected = (
boston_sdf
.transform(
lambda sdf: (
sdf
.select(
[
c for c in
sdf.columns
if re.search(
'S$',
c,
)
]
)
)
)
)
selected.printSchema()
ouput
root
|-- INDUS: double (nullable = true)
|-- CHAS: double (nullable = true)
|-- DIS: double (nullable = true)
4. まとめ
pysparkでtransfromを使用することで自分自身を参照できました。
pandasのtransformと紛らわしいのには注意が必要です。