Skip to main content
 首页 » 编程设计

python之如何在 pyspark 数据框列中创建列表

2024年12月31日25bjzhanghao

我有一个数据框,其中包含以下数据:

df.show() 
 
    +-----+------+--------+ 
    | id_A| idx_B| B_value| 
    +-----+------+--------+ 
    |    a|     0|       7| 
    |    b|     0|       5| 
    |    b|     2|       2| 
    +-----+------+--------+ 

假设 B 总共有 3 个可能的索引,我想创建一个表,将所有索引和值合并到一个列表(或 numpy 数组)中,如下所示:

final_df.show() 
 
    +-----+----------+ 
    | id_A|  B_values| 
    +-----+----------+ 
    |    a| [7, 0, 0]| 
    |    b| [5, 0, 2]| 
    +-----+----------+ 

我已经成功走到这一步了:

from pyspark.sql import functions as f 
 
temp_df = df.withColumn('B_tuple', f.struct(df['idx_B'], df['B_value']))\ 
            .groupBy('id_A').agg(f.collect_list('B_tuple').alias('B_tuples')) 
temp_df.show() 
 
    +-----+-----------------+ 
    | id_A|         B_tuples| 
    +-----+-----------------+ 
    |    a|         [[0, 7]]| 
    |    b| [[0, 5], [2, 2]]| 
    +-----+-----------------+ 

但现在我无法运行适当的 udf 函数将 temp_df 转换为 final_df。

有更简单的方法吗?

如果不是,我应该使用什么函数来完成转换?

请您参考如下方法:

所以我找到了解决方案,

def create_vector(tuples_list, size): 
    my_list = [0] * size 
    for x in tuples_list: 
        my_list[x["idx_B"]] = x["B_value"] 
    return my_list 
 
create_vector_udf = f.udf(create_vector, ArrayType(IntegerType())) 
 
final_df = temp_df.with_column('B_values', create_vector_udf(temp_df['B_tuples'])).select(['id_A', 'B_values']) 
 
final_df.show() 
 
    +-----+----------+ 
    | id_A|  B_values| 
    +-----+----------+ 
    |    a| [7, 0, 0]| 
    |    b| [5, 0, 2]| 
    +-----+----------+