获取具有开始时间和结束时间的唯一ID计数

2024-04-24 20:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个数据框

Date  ID
1      A
2      B
3      C
4      D
1      A
2      B
3      C
4      A
1      B
2      A

其中开始日期和结束日期是计算并找到ID的唯一计数它只是一个人来是日期1和结束日期是1是:

Date Id
1    A
1    A
1    B 

所以唯一用户是2,记录的总数是3

我想用column Start_dateEnd_date以及ID的唯一计数创建这个数据帧

Start_date   End_date  Unique
  1             1        3
  1             2        2
  1             3        3
  1             4        4
  2             2        2 
  2             3        3 
  2             4        4
  3             3        1
  3             4        3
  4             4        2

怎么做?你知道吗


Tags: 数据用户iddate记录columnstartend
1条回答
网友
1楼 · 发布于 2024-04-24 20:22:12

这是解决办法

import pyspark.sql.functions as F
from pyspark.sql.types import ArrayType,IntegerType

def date_ranges(start_date,end_date):
    return list(range(start_date,end_date+1))

date_ranges_udf = F.udf(date_ranges, ArrayType(IntegerType()))

df = spark.createDataFrame(
    [(1,'A'),(2,'B'),(3,'C'),(4,'D'),(1,'A'),
    (2,'B'),(3,'C'),(4,'A'), (1,'B'),(2,'A')], ["Date", "ID"])

df_start_end_dates = df.select(
    F.min(F.col('Date')).alias('min_date'),F.max(F.col('Date')).alias('max_date')
).withColumn('start_date',F.col('min_date')).select(
    'start_date',
    F.explode(
        date_ranges_udf(F.col('min_date'),F.col('max_date'))
    ).alias('end_date')
)

cond = [F.col('Date') >= F.col('start_date'), F.col('Date') <= F.col('end_date')]

df_start_end_dates.join(
    df,cond
).groupBy(
    'start_date','end_date'
).agg(
    F.countDistinct('ID').alias('Unique')
).orderBy(
    'start_date','end_date'
).show()

结果是什么

+     +    +   +
|start_date|end_date|Unique|
+     +    +   +
|         1|       1|     2|
|         1|       2|     2|
|         1|       3|     3|
|         1|       4|     4|
+     +    +   +

相关问题 更多 >