【问题标题】:Find previous unique value in a Dataframe - Pyspark在数据框中查找以前的唯一值 - Pyspark
【发布时间】:2018-08-30 13:59:54
【问题描述】:

我有一个数据框,其中包含客户每个日期的多个产品。在一个新列中,我试图按客户获取以前的唯一日期。

Cst Prod    Dt  Desired Output
C1  P1  1-Jan-16    0
C1  P2  1-Jan-16    0
C1  P3  1-Jan-16    0
C1  P4  1-Jan-16    0
C1  P1  20-Jan-16   1-Jan-16
C1  P2  20-Jan-16   1-Jan-16
C2  P2  5-Feb-17    0
C2  P3  5-Feb-17    0
C2  P4  5-Feb-17    0
C2  P1  30-Mar-17   5-Feb-17

我刚开始使用 PySpark。到目前为止,我尝试为每个客户创建一个日期数组列 (CUM_DATE),然后应用 UDF 来获取除行中一个之外的所有日期,然后取数组列的最大值。

有点像-

def filter_currdate(arr, dt):
    return [x for x in arr if x not in dt]

filter_currdate_udf = F.udf(lambda x: filter_code(x), ArrayType(DateType()))

df = df.withColumn('except_date', filter_currdate_udf(df['CUM_DATE'], df['Dt']))
df = df.withColumn('max_prev_date',F.max(df['except_date']))

但它遇到了错误,我无法找到更好的方法来获得此输出。

【问题讨论】:

    标签: python pyspark apache-spark-sql


    【解决方案1】:

    没有自定义 UDF 函数还有其他方法。假设df 有列cstproddt

    from pyspark.sql.functions import max
    df.alias('df1').join(df.alias('df2'), 
    ( 
       col('df1.cst')==col('df2.cst') 
     & col('df1.prod') == col('df2.prod')
     & col('df1.dt') > col('df2.dt'),
     how='left_outer'
    ).select('df1.*', 'df2.dt')
    .groupBy('df1.cst', 'df1.prod', 'df1.dt')
    .agg(max('df2.dt'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      相关资源
      最近更新 更多