我有一个带有编号列(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
型
1条答案
按热度按时间txu3uszq1#
select函数接受一个列数组,但是withColumn有两个参数columnName和value。如果你想动态添加列,可以这样做:
字符串