我目前正在尝试练习一些数据操作程序,并面临着如何根据特殊条件创建子集的问题。
我们假设数据框如下所示:
Name ID ContractDate LoanSum DurationOfDelay
A ID1 2023-01-01 10 10
A ID1 2023-01-03 15 15
A ID1 2022-12-29 20 0
A ID1 2022-12-28 40 0
B ID2 2023-01-05 15 19
B ID2 2023-01-10 30 0
B ID2 2023-01-07 35 25
B ID2 2023-01-06 35 0
我的目标是为每个唯一 ID(或名称)显示首先发放的贷款的索引号,且 DurationOfDelay > 0
预期结果:
Name ID IndexNum
A ID1 3
B ID2 1
说明:对于 ID1,发放了四笔贷款:2022-12-28、2022-12-29、2023-01-01 和 2023-01-03。我们可以在 2023-01-01 首先识别出 DurationOfDelay > 0 的存在,这是向借款人发放的第三笔贷款。
ID2 还发放了四笔贷款:2023-01-05、2023-01-06、2023-01-07 和 2023-01-10。我们可以在 2023-01-05 首先识别出 DurationOfDelay > 0 的存在,这是向借款人发放的第一笔贷款。
到目前为止我所做的:
window_spec_subset = Window.partitionBy('ID').orderBy('ContractDate')
subset = df.filter(F.col('DurationOfDelay') > 0) \
.withColumn('row_num', F.row_number().over(window_spec_subset)) \
.filter(F.col('row_num') == 1) \
.drop('row_num')
subset.show()
+----+---+------------+-------+---------------+
|Name| ID|ContractDate|LoanSum|DurationOfDelay|
+----+---+------------+-------+---------------+
| A|ID1| 2023-01-01| 10| 10|
| B|ID2| 2023-01-05| 15| 19|
+----+---+------------+-------+---------------+
这段代码允许我以这样的方式对数据进行分组:对于每个借款人,仅返回最先发放且 DurationOfDelay > 0 的贷款。
但我堆叠起来显示首先发放的贷款的索引号,而 DurationOfDelay > 0。
您愿意帮助我取得这些成果吗?非常感谢任何形式的帮助!
可能不是最有效的,但它应该有效:
输出: