0

レコードの pyspark データフレームdfがあり、各レコードにはidとがありgroup、2 つのイベント ( event1, event2) が発生したかどうかをマークします。各グループの id の数を見つけたいのですが、それは次のとおりです。

  1. 両方の出来事が彼らに起こりました。
  2. event2 は発生しましたが、event1 は発生しませんでした。

ここで簡単な例を抽出しています:

df:
|  id | event1 | event2 | group
| 001 |      1 |      0 |     A
| 001 |      1 |      0 |     A    
| 001 |      1 |      1 |     A  
| 002 |      0 |      1 |     A  
| 003 |      1 |      0 |     A  
| 003 |      1 |      1 |     A  
| ... |    ... |    ... |     B
...  

上記dfgroup = Aは、2 つの ID に event1:(001,003) があり、3 つの ID に event2:(001,002,003) があるためです。たとえば、event1 ではなく event2 の ID の数は 1 です。

このようなものが得られることを願っています。

group | event2_not_1 | event1_and_2 |
    A |            1 |            2 |
    B |          ... |          ... |

これまでのところ、各イベントに表示される一連の ID を収集してから、セット操作を で個別に実行しようとしましたnew_df。しかし、これはかなり不器用だと感じました。例えば、

df_new = (
  df.withColumn('event1_id', when(col('event1') == 1, col('id')))
    .withColumn('event2_id', when(col('event2') == 1, col('id')))
    .groupby('group').agg(collect_set('event1_id').alias('has_event1'),
                          collect_set('event2_id').alias('has_event2'))
)

pysparkでこれをエレガントに達成するにはどうすればよいですか?

4

1 に答える 1