如何在pyspark中的多个列之间应用相同的操作
我需要在许多列之间应用逻辑OR“|”,并在pyspark中生成一个新列。如果有许多列具有布尔值,并且需要生成一个结果列,该结果列是所有列的逻辑OR,那么最好的方法是什么。例如,如果我有一个数据帧df如何在pyspark中的多个列之间应用相同的操作,pyspark,Pyspark,我需要在许多列之间应用逻辑OR“|”,并在pyspark中生成一个新列。如果有许多列具有布尔值,并且需要生成一个结果列,该结果列是所有列的逻辑OR,那么最好的方法是什么。例如,如果我有一个数据帧df data = [(True,False,True), (False,False,True), (True,True,True), (False,True,False), (True,False,False)] df = sc.
data = [(True,False,True),
(False,False,True),
(True,True,True),
(False,True,False),
(True,False,False)]
df = sc.parallelize(data).toDF(['ID', 'date'])
+-----+-----+-----+
| a| b| c|
+-----+-----+-----+
| true|false| true|
|false|false| true|
| true| true| true|
|false| true|false|
| true|false|false|
+-----+-----+-----+
如何通过应用逻辑OR添加列“d”,如下所示
+-----+-----+-----+-----+
| a| b| c| d|
+-----+-----+-----+-----+
| true|false| true| true|
|false|false| true| true|
| true| true| true| true|
|false| true|false| true|
| true|false|false| true|
+-----+-----+-----+-----+
将布尔列作为其条件。使用PySpark时,在阅读列时考虑列表达式通常很有用 PySpark列上的逻辑操作使用位运算符: &为及 |为了或 ~z~当然不是
将这些与比较运算符(如相结合时,可以将输入列放入列表中,并使用reduce动态构造逻辑表达式。然后将结果分配给新列 以下是实现:
>>> from functools import reduce
>>> from pyspark.sql import functions as f
>>> data
[(True, False, True), (False, False, True), (True, True, True), (False, True, False), (True, False, False)]
>>> df = sc.parallelize(data).toDF(['a', 'b', 'c'])
>>> df.show()
+-----+-----+-----+
| a| b| c|
+-----+-----+-----+
| true|false| true|
|false|false| true|
| true| true| true|
|false| true|false|
| true|false|false|
+-----+-----+-----+
>>> columns = ['a', 'b', 'c']
>>> df.withColumn('and', reduce(lambda x, y: x & y, [f.col(c) for c in columns])).show()
+-----+-----+-----+-----+
| a| b| c| and|
+-----+-----+-----+-----+
| true|false| true|false|
|false|false| true|false|
| true| true| true| true|
|false| true|false|false|
| true|false|false|false|
+-----+-----+-----+-----+
>>> df.withColumn('or', reduce(lambda x, y: x | y, [f.col(c) for c in columns])).show()
+-----+-----+-----+----+
| a| b| c| or|
+-----+-----+-----+----+
| true|false| true|true|
|false|false| true|true|
| true| true| true|true|
|false| true|false|true|
| true|false|false|true|
+-----+-----+-----+----+
谢谢但是我一直在寻找可以跨多个列应用操作的东西,我不必在when子句中手动输入每个列。太棒了!!!谢谢我使用了df.with column'or',reducelambda x,y:x | y,[f.colc代表df.columns中的c].show
>>> from functools import reduce
>>> from pyspark.sql import functions as f
>>> data
[(True, False, True), (False, False, True), (True, True, True), (False, True, False), (True, False, False)]
>>> df = sc.parallelize(data).toDF(['a', 'b', 'c'])
>>> df.show()
+-----+-----+-----+
| a| b| c|
+-----+-----+-----+
| true|false| true|
|false|false| true|
| true| true| true|
|false| true|false|
| true|false|false|
+-----+-----+-----+
>>> columns = ['a', 'b', 'c']
>>> df.withColumn('and', reduce(lambda x, y: x & y, [f.col(c) for c in columns])).show()
+-----+-----+-----+-----+
| a| b| c| and|
+-----+-----+-----+-----+
| true|false| true|false|
|false|false| true|false|
| true| true| true| true|
|false| true|false|false|
| true|false|false|false|
+-----+-----+-----+-----+
>>> df.withColumn('or', reduce(lambda x, y: x | y, [f.col(c) for c in columns])).show()
+-----+-----+-----+----+
| a| b| c| or|
+-----+-----+-----+----+
| true|false| true|true|
|false|false| true|true|
| true| true| true|true|
|false| true|false|true|
| true|false|false|true|
+-----+-----+-----+----+