[英]Pyspark. Create A new column based on multiple columns and multiple rows
我下面有一个 dataframe:
ID | 特点1 | 特征2 | 特点3 | 特征4 |
---|---|---|---|---|
1个 | A | 0 | 0 | 0 |
1个 | b | 0 | 0 | 0 |
1个 | c | 0 | 0 | 0 |
2个 | A | 1个 | 0 | 0 |
2个 | b | 0 | 0 | 0 |
2个 | c | 0 | 0 | 0 |
3个 | b | 0 | 0 | 0 |
3个 | c | 0 | 1个 | 0 |
我需要一个新的专栏并获得下面的 dataframe:
ID | 特点1 | 特征2 | 特点3 | 特征4 | 新专栏 |
---|---|---|---|---|---|
1个 | A | 0 | 0 | 0 | 1个 |
1个 | b | 0 | 0 | 0 | 1个 |
1个 | c | 0 | 0 | 0 | 1个 |
2个 | A | 1个 | 0 | 0 | 0 |
2个 | b | 0 | 0 | 0 | 0 |
2个 | c | 0 | 0 | 0 | 0 |
3个 | b | 0 | 0 | 0 | 0 |
3个 | c | 0 | 1个 | 0 | 0 |
对于id=1
的情况,newColumn 应该为 1,因为所有具有feature2
、 feature3
和feature4
的行都是 0。但是,对于id==2
的情况,NewColumn 应该为 0,因为在这种情况下,当feature1=a
时feature2
为 1。 id==3
时相同,NewColumn 应该为 0,因为feature3
包含 1。基本上,我需要单独考虑所有 id,并检查feature2
、 feature3
和feature4
列是否包含 1。如何在 Pyspark 中有效地实现它?
由于它需要跨行检查值,您可以使用collect_list
、 feature3和feature4 array
的collect_list超过 window 按列id分区, flatten
数组,使用exists
检查数组是否包含1
的任何值,然后cast
否定的 boolean 值到 integer。(对于 Spark 版本 >= 2.4)
from pyspark.sql.functions import expr
df = df.withColumn('NewColumn',
expr("""cast(
not exists(
flatten(
collect_list(array(feature2,feature3,feature4)) over (partition by id)),
v -> v = 1)
as int)"""))
df.show()
# +---+--------+--------+--------+--------+---------+
# | id|feature1|feature2|feature3|feature4|NewColumn|
# +---+--------+--------+--------+--------+---------+
# | 1| a| 0| 0| 0| 1|
# | 1| b| 0| 0| 0| 1|
# | 1| c| 0| 0| 0| 1|
# | 3| b| 0| 0| 0| 0|
# | 3| c| 0| 1| 0| 0|
# | 2| a| 1| 0| 0| 0|
# | 2| b| 0| 0| 0| 0|
# | 2| c| 0| 0| 0| 0|
# +---+--------+--------+--------+--------+---------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.