我在Pyspark有一个数据框
df.show()
+-----+-----+
|test1|test2|
+-----+-----+
|false| true|
| true| true|
| true|false|
|false| true|
|false|false|
|false|false|
|false|false|
| true| true|
|false|false|
+-----+-----+
我想将数据框中的所有false
值转换为0
和true to 1
。
我在做如下
df1 = df.withColumn('test1', F.when(df.test1 == 'false', 0).otherwise(1)).withColumn('test2', F.when(df.test2 == 'false', 0).otherwise(1))
我得到了我的结果。但我认为可能有更好的方法来做到这一点。
答案 0 :(得分:3)
使用CASE ... WHEN
(when(...).otherwise(...)
)是不必要的冗长。相反,您只需cast
到整数:
from pyspark.sql.functions import col
df.select([col(c).cast("integer") for c ["test1", "test2"]])
答案 1 :(得分:1)
避免多个withColumn
的一种方法,尤其是当您拥有大量列时,可以使用functools.reduce
,并且只在此处使用withColumn
:
import pyspark.sql.functions as F
from functools import reduce
cols = ['test1', 'test2']
reduce(lambda df, c: df.withColumn(c, F.when(df[c] == 'false', 0).otherwise(1)), cols, df).show()
+-----+-----+
|test1|test2|
+-----+-----+
| 1| 0|
| 0| 1|
+-----+-----+
答案 2 :(得分:0)
对于Scala用户:
df.withColumn('new', col("test1").isNotNull.cast(IntegerType))
我希望能帮上忙。
答案 3 :(得分:0)
我假设两列(service_tags
,test1
)的数据类型是布尔型。您可以尝试以下提到的建议:
test2
列import pyspark.sql.functions as F
df = df.withColumn( "test1" , F.when( F.col("test1") , F.lit(1) ).otherwise(0) ).withColumn( "test2" , F.when( F.col("test2") , F.lit(1) ).otherwise(0) )
和"test1"
本质上是布尔值。因此,您无需使用"test2"
(或==True
)来等同它们。
与使用udfs(用户定义函数)的方法相比,使用Pyspark函数可使此路由更快(并且更具可伸缩性)。
答案 4 :(得分:0)
也许这有助于以清晰的方式做到这一点,也适用于其他情况:
from pyspark.sql.functions
import col from pyspark.sql.types
import IntegerType
def fromBooleanToInt(s):
"""
This is just a simple python function to move boolean to integers.
>>> fromBooleanToInt(None)
>>> fromBooleanToInt(True)
1
>>> fromBooleanToInt(False)
1
"""
if s == True:
return 1
elif s==False:
return 0
else:
return None
这是为了创建一个简单的数据框来测试
df_with_doubles = spark.createDataFrame([(True, False), (None,True)], ['A', 'B'])
df_with_doubles.show()
+----+-----+
| A| B|
+----+-----+
|true|false|
|null| true|
+----+-----+
这是定义udf
fromBooleanToInt_udf = F.udf(lambda x: fromBooleanToInt(x), IntegerType())
现在让我们进行转换/转换:
column_to_change = 'A'
df_with_doubles_ = df_with_doubles.withColumn(column_to_change,fromBooleanToInt_udf(df_with_doubles[column_to_change]))
df_with_doubles_.show()
+----+-----+
| A| B|
+----+-----+
| 1|false|
|null| true|
+----+-----+