Skip to main content
 首页 » 编程设计

python之如何将数据帧的 pyspark 列中包含的 unicode 列表转换为浮点列表

2024年09月03日26dudu

我已经创建了一个数据框,如图所示

   import ast 
   from pyspark.sql.functions import udf 
   values = [(u'['2','4','713',10),(u'['12','245']',20),(u'['101','12']',30)] 
   df = sqlContext.createDataFrame(values,['list','A']) 
   df.show() 
   +-----------------+---+ 
   |             list|  A| 
   +-----------------+---+ 
   |u'['2','4','713']| 10| 
   |  u' ['12','245']| 20| 
   |  u'['101','12',]| 30| 
   +-----------------+---+ 
 
**How can I convert the above dataframe such that each element in the list is a float and is within a proper list** 
I tried the below one : 
 
   def df_amp_conversion(df_modelamp): 
      string_list_to_list = udf(lambda row: ast.literal_eval(str(row))) 
      df_modelamp  = df_modelamp.withColumn('float_list',string_list_to_list(col("list"))) 
 
   df2 = amp_conversion(df) 

但数据保持不变,没有变化。 我不想将数据帧转换为 Pandas 或使用收集,因为它是内存密集型的。 如果可能,请尝试给我一个最佳解决方案。我正在使用 pyspark

请您参考如下方法:

那是因为你忘记了类型

udf(lambda row: ast.literal_eval(str(row)), "array<integer>") 

虽然这样的事情会更有效率:

from pyspark.sql.functions import rtrim, ltrim, split  
 
df = spark.createDataFrame(["""u'[23,4,77,890,4]"""], "string").toDF("list") 
 
df.select(split( 
    regexp_replace("list", "^u'\\[|\\]$", ""), "," 
).cast("array<integer>").alias("list")).show() 
 
# +-------------------+ 
# |               list| 
# +-------------------+ 
# |[23, 4, 77, 890, 4]| 
# +-------------------+