Pyspark数据帧将false和true转换为0和1

时间:2018-06-14 21:15:37

标签: python apache-spark pyspark

我在Pyspark有一个数据框

df.show()


+-----+-----+
|test1|test2|
+-----+-----+
|false| true|
| true| true|
| true|false|
|false| true|
|false|false|
|false|false|
|false|false|
| true| true|
|false|false|
+-----+-----+

我想将数据框中的所有false值转换为0true to 1

我在做如下

df1 = df.withColumn('test1', F.when(df.test1 == 'false', 0).otherwise(1)).withColumn('test2', F.when(df.test2 == 'false', 0).otherwise(1))

我得到了我的结果。但我认为可能有更好的方法来做到这一点。

5 个答案:

答案 0 :(得分:3)

使用CASE ... WHENwhen(...).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_tagstest1)的数据类型是布尔型。您可以尝试以下提到的建议:

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|
+----+-----+