我想在pyspark中实现累积减法。 我有这样的数据集
计算 | 科伊特姆 |
---|---|
1000 | 1110 |
100 | 1110 |
50 | 1110 |
30 | 1110 |
20 | 1110 |
2000 | 1210 |
10 | 1210 |
200 | 1210 |
-100 | 1210 |
20 | 1210 |
我想要的结果是这样的:-
计算 | 科伊特姆 | _uncs |
---|---|---|
1000 | 1110 | 1000 |
100 | 1110 | 900 |
50 | 1110 | 850 |
30 | 1110 | 820 |
20 | 1110 | 800 |
2000 | 1210 | 2000 |
10 | 1210 | 1990 |
200 | 1210 | 1790 |
-100 | 1210 | 1890 |
20 | 1210 | 1870 |
为此,我尝试了以下代码:-
df = _cost_srt.orderBy("coitm")
partition_by = Window().partitionBy("COITM").orderBy(F.desc("COCHDJ"))
df = df.withColumn("rnb", F.row_number().over(partition_by))
df = df.withColumn(
"_UNCS", F.when(F.col("rnb") == 1, F.col("COUNCS")).otherwise(F.lit(None))
)
_output = df.withColumn(
"_UNCS",
F.when(
F.col("rnb") > 1, F.lag(F.col("_UNCS")).over(partition_by) - F.col("COUNCS")
).otherwise(F.col("_UNCS")),
)
我仅对 rnb 1 和 rnb 2 实现了理想的输出,之后 _uncs 变为 null。我怎样才能获得我想要的代码?请帮助我。
要实现您的场景,请尝试以下代码:
df = cost_srt.orderBy("coitm")
window_spec = Window.partitionBy("coitm").orderBy(F.desc("councs"))
df = df.withColumn("rnb", F.row_number().over(window_spec))
df.show()
df = df.withColumn("negatives", F.when(F.col("rnb") == 1, F.col("COUNCS")).otherwise(- df["COUNCS"]))
df.show()
result_df = df.withColumn("_UNCS", F.sum("negatives").over(window_spec))
result_df.show()