Python Pyspark从下一列减去dataframe列,并将结果保存到另一个dataframe
我正在从事一个个人PySpark项目,目的是为了学习,我有一个特殊的问题 我有一个包含N列的数据帧(df),其中我想从下一列中减去每一列(例如,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的第
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
我找到了两种解决方案:
# 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。你的回答为我指明了一个好的方向,它帮助我找到了答案。