我有一个pyspark框架如下:
c1 c2
111 null
null 222
333 444
null null
字符串
我需要有一个额外的列像下面的最终框架
c1 c2 new_col
111 null 111
null 222 222
333 444 333
333 444 444
null null null
型
如果两个列都有值,那么我需要创建一个新的行,其中包含cols1和col2的值。
df = df.withColumn('new_col', when(col('c1').isNull(), col('c2')) \
.otherwise(when(col('c2').isNull(), col('c1')).otherwise(col(c2'))))
型
如果列c1和c2都有值,我会创建一个新行。有人能提出解决方案吗?
4条答案
按热度按时间pn9klfpd1#
可以使用
unionAll
创建新行。在Scala上,可以轻松转换为Python:字符串
测试结果:
型
o75abkj42#
字符串
这里是结果,应该是你想要的输出
型
wmvff8tz3#
你可以使用
coalesce
来创建一个数组,然后使用explode
来从中创建行:字符串
输出量:
型
jecbmhm34#
要实现所需的结果,您可以使用
union
操作将DataFrame与其自身的修改版本组合在一起,其中新列(new_col
)根据您提到的条件填充。以下是如何做到这一点:字符串
这将为您提供以下DataFrame:
型
在这里,
F.array(df["c1"], df["c2"])
用于创建一个数组列new_col
,其中包含c1
和c2
值。然后使用F.explode
函数将该数组分解为单独的行。这样,您可以为数组中的每个值获得一个新行。