在给定条件下显示行索引号

问题描述 投票:0回答:1

我目前正在尝试练习一些数据操作程序,并面临着如何根据特殊条件创建子集的问题。

我们假设数据框如下所示:

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。

您愿意帮助我实现这些成果吗? 非常感谢任何形式的帮助!

python pyspark subset data-manipulation row-number
1个回答
0
投票

可能不是最有效的,但它应该有效:

subset = (df.withColumn('IndexNum', F.row_number().over(window_spec_subset))
            .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|IndexNum|
+----+---+------------+-------+---------------+--------+
|   A|ID1|  2023-01-01|     10|             10|       3|
|   B|ID2|  2023-01-05|     15|             19|       1|
+----+---+------------+-------+---------------+--------+
© www.soinside.com 2019 - 2024. All rights reserved.