我如何将合并Pyspark与Column结合在一起?

djmepvbi  于 11个月前  发布在  Spark
关注(0)|答案(1)|浏览(121)

我有一个带有编号列(1到12)的嵌套框架,我需要结合with列和for循环的逻辑。给出这个示例嵌套框架:

df = spark.createDataFrame(
[(100, 100, 'A', 'A'),
  (1000, 200, 'A', 'A'),
  (1000, 300, 'B', 'A'),
  (1000, 1000, 'B', 'B')],  
"days1 int, days2 int, code1 string, code2 string")

df.show()

+-----+-----+-----+-----+
|days1|days2|code1|code2|
+-----+-----+-----+-----+
|  100|  100|    A|    A|
| 1000|  200|    A|    A|
| 1000|  300|    B|    A|
| 1000| 1000|    B|    B|
+-----+-----+-----+-----+

字符串
我需要像这样创建一个新列:如果days(n)> 100,则new(n)= code(n),否则'X'

df.withColumn('new1', F.when(F.col('days1') > 100, F.col('code1')).otherwise('X')).show()

+-----+-----+-----+-----+----+
|days1|days2|code1|code2|new1|
+-----+-----+-----+-----+----+
|  100|  100|    A|    A|   X|
| 1000|  200|    A|    A|   A|
| 1000|  300|    B|    A|   B|
| 1000| 1000|    B|    B|   B|
+-----+-----+-----+-----+----+


我知道有一个带有select的for循环,如下所示:

df.select(*[F.col(f'days{i+1}') for i in range(2)], *[F.col(f'code{i+1}') for i in range(2)]).show()

+-----+-----+-----+-----+
|days1|days2|code1|code2|
+-----+-----+-----+-----+
|  100|  100|    A|    A|
| 1000|  200|    A|    A|
| 1000|  300|    B|    A|
| 1000| 1000|    B|    B|
+-----+-----+-----+-----+


我试过这样做,但得到一个错误。这可能吗?

df.withColumn(*[(f'new{i+1}', F.when(F.col(f'days{i+1}') > 100, F.col(f'code{i+1}')).otherwise('X')) 
for i in range(2)])\
      .select('days1', 'code1', 'new1')\
      .show()
    
    TypeError: col should be Column

txu3uszq

txu3uszq1#

select函数接受一个列数组,但是withColumn有两个参数columnName和value。如果你想动态添加列,可以这样做:

for i in range(2):
    df = df.withColumn(f'new{i+1}', F.when(F.col(f'days{i+1}') > 100, F.col(f'code{i+1}')).otherwise('X'))

字符串

相关问题