-1

我想对数据框中的分区的行号进行循环,以检查条件并根据当前 row_number 的结果创建额外的列。

所以,我有一个数据框表示与主 ID <-> 原始 ID 关联的联系人(一个主可以有多个原始)。我用窗口函数和 row_number() 在最近创建的 raws 的分区上对这个数据框进行了分区:

# Create a window specification to define the partitionning of masters
# base on the most recent created
window_spec = Window \
    .partitionBy(raw_df.master_id) \
    .orderBy(raw_df.created.desc())

# Create a dataframe with a row number for each partition to process
# raws grouped with their master from the most recent to the least
partionned_df = raw_df \
    .select(
        fields + [
            F.row_number().over(window_spec).alias('row_nb')
        ]
    ) \
    .orderBy(['master_id', 'row_nb'])

这是我的数据框:

partionned_df.show()  
+------+---+---------------+---------+------------+-------------+------+
|master|raw|        created|last_name|mobile_phone|norm_civility|row_nb|
+------+---+---------------+---------+------------+-------------+------+
|     1|  3|02-05 11:22:...|     null|   641203047|         null|     1|
|     1|  5|02-05 11:22:...|     null|        null|     monsieur|     2|
|     1|  6|02-05 11:22:...|     null|        null|         null|     3|
|     1|  1|02-05 10:29:...|    name1|        null|           mr|     4|
|     3| 11|02-05 11:26:...|     null|        null|     monsieur|     1|
|     3|  4|02-05 10:30:...|     null|   630254175|         null|     2|
|     5| 15|02-05 11:35:...|     null|        null|         null|     1|
|     5| 13|02-05 11:35:...|     null|        null|         null|     2|
|     5| 14|02-05 11:33:...| name3   |        null|     monsieur|     3|
|     5|  7|02-05 11:22:...|     null|        null|         null|     4|
+---+------+---------------+---------+------------+-------------+------+ 

我想要的是在对每个分区的 row_number 进行迭代并执行一些条件(例如,如果 first_name 不为空等)之后创建一个只有不同的主数据和新列的新数据帧,并且如果条件没有在第一个验证分区的row_nb,检查另一个等,直到我循环分区的每个行号。

我想要的最终数据框类似于:

+------+---------+------------+-------------+
|master|last_name|mobile_phone|norm_civility|
+------+---------+------------+-------------+
|     1|    name1|   641203047|    monsieur |
|     3|     null|   630254175|    monsieur |
|     5|    name3|        null|    monsieur |
+------+---------+------------+-------------+

非常感谢您提前提供的帮助。

4

1 回答 1

0

聚合这个数据框。想法是在函数中使用ignorenulls选项。first()

df = df.select('master','last_name','mobile_phone','norm_civility').groupBy(col('master')).agg(first(col('last_name'),ignorenulls = True).alias('last_name'),
                                   first(col('mobile_phone'),ignorenulls = True).alias('mobile_phone'),
                                   first(col('norm_civility'),ignorenulls = True).alias('norm_civility'))
df.show()
+------+---------+------------+-------------+
|master|last_name|mobile_phone|norm_civility|
+------+---------+------------+-------------+
|     5|    name3|        null|     monsieur|
|     1|    name1|   641203047|     monsieur|
|     3|     null|   630254175|     monsieur|
+------+---------+------------+-------------+

你可以在这里探索一个类似的问题。

于 2019-02-08T18:42:48.037 回答