レコードの pyspark データフレームdf
があり、各レコードにはid
とがありgroup
、2 つのイベント ( event1, event2
) が発生したかどうかをマークします。各グループの id の数を見つけたいのですが、それは次のとおりです。
- 両方の出来事が彼らに起こりました。
- 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
...
上記df
でgroup = 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でこれをエレガントに達成するにはどうすればよいですか?