Python Pyspark从下一列减去dataframe列,并将结果保存到另一个dataframe

Python Pyspark从下一列减去dataframe列,并将结果保存到另一个dataframe,python,dataframe,apache-spark,pyspark,apache-spark-sql,Python,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我正在从事一个个人PySpark项目,目的是为了学习,我有一个特殊的问题 我有一个包含N列的数据帧(df),其中我想从下一列中减去每一列(例如,col1-col2,col2-col3,…,col(N+1)-colN),并将结果差异列保存在另一个数据帧中 我通过解析JSON生成此df,将其保存到pandas数据框(模式:dates列,每个项目的列)中,将列转换为行(每个日期有一个单独的Items列和列),然后将其转换为spark df。我这样做是因为Spark中的逐行操作似乎很难实现 我将df的第

我正在从事一个个人PySpark项目,目的是为了学习,我有一个特殊的问题

我有一个包含N列的数据帧(df),其中我想从下一列中减去每一列(例如,
col1-col2
col2-col3
,…,
col(N+1)-colN
),并将结果差异列保存在另一个数据帧中

我通过解析JSON生成此df,将其保存到pandas数据框(模式:dates列,每个项目的列)中,将列转换为行(每个日期有一个单独的Items列和列),然后将其转换为spark df。我这样做是因为Spark中的逐行操作似乎很难实现

我将df的第一列(Items列)移动到一个新的数据帧(ndf),因此只剩下以下模式(标题由日期组成,数据仅为整数):

日期1 日期2 日期3 ... 达顿 104 98 98 ... 0 223 135 80 ... 0 143 122 114 ... 0 91 79 73 ... 0 我找到了两种解决方案:

  • 对于转置的数据帧,正如我在上面的问题中所提到的,reddit r/dataengineering上的一位用户帮助我解决了这个问题:

    # list to save column subtractions
    col_defs = []
    # grab the date columns
    date_cols = df.columns[1:]
    # for index and column
    for i, date in enumerate(date_cols):
        if i > 0:
            # save the difference between each 2 columns to the list
            col_defs.append((df[date_cols[i - 1]] - df[date]).alias(date))
    # result df containing only the items column and the differences for each date
    result = df.select('county', *col_defs)
    
  • 如果我不转置数据帧,我可以应用窗口函数,正如@mck在对问题的评论中所建议的那样。我更喜欢这种方式,因为我避免了转置,列数也将保持不变。这对我理解它们的工作方式非常有帮助:

  • 日期 项目1 项目2 ... 日期1 104 223 ... 日期2 98 135 ... 日期3 98 80 ...
    这看起来像是一种不必要的冗长方法。您可以只使用数据帧而不使用任何转置,并使用窗口函数来获得与前一行的差异。请参见示例。谢谢@mck。你的回答为我指明了一个好的方向,它帮助我找到了答案。