pyspark.pandasのDataFrameで重複行を確認する方法

pyspark.pandasライブラリで、全ての列の値が重複していないか確認するために「display(df[df.duplicated()])」をそのまま使うとエラーが出てきてしまいました。その対策として以下2つの方法を試したところエラーを回避することができました。

with句で一時的に「compute.ops_on_diff_frames」を設定する

pandasのオプション設定ができる「option_context」を利用します。「option_context」はwith句内で一時的に設定を変更するメソッドです。このメソッドで「compute.ops_on_diff_frames」をTrueにすることでネイティブのpandas操作が可能となります。Pandas API on Sparkでは、コストのかかる操作を防ぐためにデフォルトでネイティブのpandasの使用が禁止されているようです。

import pyspark.pandas ps

# 辞書型のリストでデータを作成
dict_list = [{'store_num':'00001', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'AAA', 'qty':10, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00001', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'AAA', 'qty':100, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':20, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':200, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':2000, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00003', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'CCC', 'qty':30, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'}]

df = ps.DataFrame(dict_list)

with ps.option_context('compute.ops_on_diff_frames', True):
  # すべての列の値が同じ行のみを取得
  display(df[df.duplicated()])

※指定した列の値が重複していないか確認する方法はこちらで説明しております。

to_pandas()を使う

import pyspark.pandas ps

# 辞書型のリストでデータを作成
dict_list = [{'store_num':'00001', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'AAA', 'qty':10, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00001', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'AAA', 'qty':100, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':20, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':200, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00002', 'category_l':'200', 'category_m':'20', 'category_s':'1', 'item_num':'BBB', 'qty':2000, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'},
             {'store_num':'00003', 'category_l':'100', 'category_m':'10', 'category_s':'1', 'item_num':'CCC', 'qty':30, 'delivery_day':'2024-05-01', 'delivery_cnt':1, 'rgdt':'2024-04-29'}]

df = ps.DataFrame(dict_list)

pdf = df.to_pandas()
display(pdf[pdf.duplicated()])

※SQLでの重複行の抽出方法はこちらで確認できます。

【余談】データ型の違い

tpye()でデータ型の確認をしたところ、以下のように異なっていることが分かりました。

通常のpandas

print(type(pdf)) -> pandas.core.frame.DataFrame

pyspark.pandas

print(type(df)) -> pyspark.pandas.frame.DataFrame

参照

[1]https://kakehashi-dev.hatenablog.com/entry/2022/12/24/090000

コメント

タイトルとURLをコピーしました