如何在pyspark中每隔7次创建一个索引列

8ftvxx2r  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(281)

我有一个 pyspark 如下所示的Dataframe:

import pandas as pd
foo = pd.DataFrame({'date_col':['2010-02-27','2010-01-20','2010-01-20','2010-01-21','2010-01-21','2010-02-21','2010-02-22','2010-02-23','2010-02-24','2010-02-25','2010-02-26','2010-01-20','2010-01-21','2010-02-20'], 'group':['a','a','a','a','a','a','a','a','a','a','a','b','b','b']})

我想创建一个 week 列,这将是一个索引,它每7个有序的 date_colgroup .
生成的Dataframe应如下所示:

foo = pd.DataFrame({'date_col':['2010-02-27','2010-01-20','2010-01-20','2010-01-21','2010-01-21','2010-02-21','2010-02-22','2010-02-23','2010-02-24','2010-02-25','2010-02-26','2010-01-20','2010-01-21','2010-02-20'], 'group':['a','a','a','a','a','a','a','a','a','a','a','b','b','b'],
               'week':[2,2,1,1,1,1,1,1,1,1,1,1,1,1]})

有什么好主意我可以这样做吗 pyspark ?
更新
再解释一下逻辑。
基本上,操作可分为以下步骤:
订购 foodate_col 分组依据 group 创建 temp_index 列,该列将对 date_colgroup 创建 week 列将是 divtemp_index7

wwodge7n

wwodge7n1#

你可以用 dense_rank 把等级除以7。在除法之前需要先减去1,因为在sql中,秩从1开始,而不是从0开始。

from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'week', 
    (
        (F.dense_rank().over(Window.partitionBy('group').orderBy('date_col')) - 1) / 7
    ).cast('int')
)

df2.show()
+----------+-----+----+
|  date_col|group|week|
+----------+-----+----+
|2010-01-20|    b|   0|
|2010-01-21|    b|   0|
|2010-02-20|    b|   0|
|2010-01-20|    a|   0|
|2010-01-20|    a|   0|
|2010-01-21|    a|   0|
|2010-01-21|    a|   0|
|2010-02-21|    a|   0|
|2010-02-22|    a|   0|
|2010-02-23|    a|   0|
|2010-02-24|    a|   0|
|2010-02-25|    a|   0|
|2010-02-26|    a|   1|
|2010-02-27|    a|   1|
+----------+-----+----+

相关问题