尝试在没有聚合的情况下对 Pyspark df 进行分组(我认为)
Trying to groupby Pyspark df without aggregation (i think)
我正在尝试对以下 pyspark 数据框进行分组以组合 renewal_mo 值,但似乎无法弄清楚。
我有这个数据框:
+--------------+----------+----------+---------+----------+---------+
|First_Purchase|Renewal_Mo|second_buy|third_buy|fourth_buy|fifth_buy|
+--------------+----------+----------+---------+----------+---------+
|6 |1 |1 |0 |0 |0 |
|6 |12 |36 |0 |0 |0 |
|6 |24 |4 |0 |0 |0 |
|6 |18 |2 |0 |0 |0 |
|6 |3 |6 |0 |0 |0 |
|6 |2 |8 |0 |0 |0 |
|6 |36 |1 |0 |0 |0 |
|6 |6 |12 |0 |0 |0 |
|6 |12 |0 |1 |0 |0 |
|6 |3 |0 |1 |0 |0 |
|6 |2 |0 |7 |0 |0 |
|6 |6 |0 |1 |0 |0 |
|6 |1 |0 |0 |1 |0 |
|6 |12 |0 |0 |1 |0 |
+--------------+----------+----------+---------+----------+---------+
并想合并 renewal_mo 中的值,因此没有重复项并生成此数据框:
|First_Purchase|Renewal_Mo|second_buy|third_buy|fourth_buy|fifth_buy|
+--------------+----------+----------+---------+----------+---------+
|6 |1 |1 |0 |1 |0 |
|6 |12 |36 |1 |1 |0 |
|6 |24 |4 |0 |0 |0 |
|6 |18 |2 |0 |0 |0 |
|6 |3 |6 |1 |0 |0 |
|6 |2 |8 |7 |0 |0 |
|6 |36 |1 |0 |0 |0 |
|6 |6 |12 |1 |0 |0 |
+--------------+----------+----------+---------+----------+---------+
但是 groupby 似乎是错误的方法,因为它需要传递聚合函数。我可以以某种方式使用 windows 分区吗?可能还有其他方法吗?我在这里错过了什么?
如果我尝试
foo.groupby('First_Purchase','Renewal_Mo').count().show(truncate=False)
我当然丢失了购买列,它只计算 Renewal_Mo 的实例。我不确定如何处理此问题以立即在
上方获得所需的数据框
+--------------+----------+-----+
|First_Purchase|Renewal_Mo|count|
+--------------+----------+-----+
|6 |1 |2 |
|6 |12 |3 |
|6 |24 |1 |
|6 |18 |1 |
|6 |3 |2 |
|6 |2 |2 |
|6 |36 |1 |
|6 |6 |2 |
+--------------+----------+-----+
我不明白为什么你说 groupby 是错误的方法,因为它需要一个聚合函数。
我要做的唯一方法是分组和聚合,有一个内置函数 sum 可以完全满足您的需求:
df.groupBy('First_Purchase','Renewal_Mo') \
.agg({'second_by': 'sum',
'third_by': 'sum'}) # So on with remaining columns
唯一发生的事情是此方法更改了列名,但您可以使用多种方法轻松解决它。
我也觉得groupBy
有道理
from pyspark.sql.functions import *
import builtins as p
df.groupBy('First_Purchase', 'Renewal_Mo') \
.agg(*[max(c).alias(c) for c in df.columns[2:]]) \
.show()
+--------------+----------+----------+---------+----------+---------+
|First_Purchase|Renewal_Mo|second_buy|third_buy|fourth_buy|fifth_buy|
+--------------+----------+----------+---------+----------+---------+
| 6| 1| 1| 0| 1| 0|
| 6| 12| 36| 1| 1| 0|
| 6| 24| 4| 0| 0| 0|
| 6| 18| 2| 0| 0| 0|
| 6| 3| 6| 1| 0| 0|
| 6| 2| 8| 7| 0| 0|
| 6| 36| 1| 0| 0| 0|
| 6| 6| 12| 1| 0| 0|
+--------------+----------+----------+---------+----------+---------+
我正在尝试对以下 pyspark 数据框进行分组以组合 renewal_mo 值,但似乎无法弄清楚。
我有这个数据框:
+--------------+----------+----------+---------+----------+---------+
|First_Purchase|Renewal_Mo|second_buy|third_buy|fourth_buy|fifth_buy|
+--------------+----------+----------+---------+----------+---------+
|6 |1 |1 |0 |0 |0 |
|6 |12 |36 |0 |0 |0 |
|6 |24 |4 |0 |0 |0 |
|6 |18 |2 |0 |0 |0 |
|6 |3 |6 |0 |0 |0 |
|6 |2 |8 |0 |0 |0 |
|6 |36 |1 |0 |0 |0 |
|6 |6 |12 |0 |0 |0 |
|6 |12 |0 |1 |0 |0 |
|6 |3 |0 |1 |0 |0 |
|6 |2 |0 |7 |0 |0 |
|6 |6 |0 |1 |0 |0 |
|6 |1 |0 |0 |1 |0 |
|6 |12 |0 |0 |1 |0 |
+--------------+----------+----------+---------+----------+---------+
并想合并 renewal_mo 中的值,因此没有重复项并生成此数据框:
|First_Purchase|Renewal_Mo|second_buy|third_buy|fourth_buy|fifth_buy|
+--------------+----------+----------+---------+----------+---------+
|6 |1 |1 |0 |1 |0 |
|6 |12 |36 |1 |1 |0 |
|6 |24 |4 |0 |0 |0 |
|6 |18 |2 |0 |0 |0 |
|6 |3 |6 |1 |0 |0 |
|6 |2 |8 |7 |0 |0 |
|6 |36 |1 |0 |0 |0 |
|6 |6 |12 |1 |0 |0 |
+--------------+----------+----------+---------+----------+---------+
但是 groupby 似乎是错误的方法,因为它需要传递聚合函数。我可以以某种方式使用 windows 分区吗?可能还有其他方法吗?我在这里错过了什么?
如果我尝试
foo.groupby('First_Purchase','Renewal_Mo').count().show(truncate=False)
我当然丢失了购买列,它只计算 Renewal_Mo 的实例。我不确定如何处理此问题以立即在
上方获得所需的数据框+--------------+----------+-----+
|First_Purchase|Renewal_Mo|count|
+--------------+----------+-----+
|6 |1 |2 |
|6 |12 |3 |
|6 |24 |1 |
|6 |18 |1 |
|6 |3 |2 |
|6 |2 |2 |
|6 |36 |1 |
|6 |6 |2 |
+--------------+----------+-----+
我不明白为什么你说 groupby 是错误的方法,因为它需要一个聚合函数。 我要做的唯一方法是分组和聚合,有一个内置函数 sum 可以完全满足您的需求:
df.groupBy('First_Purchase','Renewal_Mo') \
.agg({'second_by': 'sum',
'third_by': 'sum'}) # So on with remaining columns
唯一发生的事情是此方法更改了列名,但您可以使用多种方法轻松解决它。
我也觉得groupBy
有道理
from pyspark.sql.functions import *
import builtins as p
df.groupBy('First_Purchase', 'Renewal_Mo') \
.agg(*[max(c).alias(c) for c in df.columns[2:]]) \
.show()
+--------------+----------+----------+---------+----------+---------+
|First_Purchase|Renewal_Mo|second_buy|third_buy|fourth_buy|fifth_buy|
+--------------+----------+----------+---------+----------+---------+
| 6| 1| 1| 0| 1| 0|
| 6| 12| 36| 1| 1| 0|
| 6| 24| 4| 0| 0| 0|
| 6| 18| 2| 0| 0| 0|
| 6| 3| 6| 1| 0| 0|
| 6| 2| 8| 7| 0| 0|
| 6| 36| 1| 0| 0| 0|
| 6| 6| 12| 1| 0| 0|
+--------------+----------+----------+---------+----------+---------+