PySpark:如何使用isnan检查列是否包含数字

Jua*_*ith 4 apache-spark pyspark

我有一个如下所示的数据框:

+------------------------+----------+
|Postal code             |PostalCode|
+------------------------+----------+
|Muxía                   |null      |
|Fuensanta               |null      |
|Salobre                 |null      |
|Bolulla                 |null      |
|33004                   |null      |
|Santa Eulàlia de Ronçana|null      |
|Cabañes de Esgueva      |null      |
|Vallarta de Bureba      |null      |
|Villaverde del Monte    |null      |
|Villaluenga del Rosario |null      |
+------------------------+----------+
Run Code Online (Sandbox Code Playgroud)

如果邮政编码列仅包含数字,我想创建一个只存储数字邮政编码的新列.如果邮政编码列仅包含文本,则需要创建名为"Municipality"的新列.

我尝试使用'isnan'作为我的理解,这将检查一个值是否不是一个数字,但这似乎不起作用.列类型应该是字符串,以使其工作或?

到目前为止,我的尝试是:

> df2 = df.withColumn('PostalCode', when(isnan(df['Postal code']), df['Postal code']) 
Run Code Online (Sandbox Code Playgroud)

查看上面发布的数据框结果示例,您可以看到为新列返回所有值'Null',也为邮政编码'33004'返回

任何想法将不胜感激

Ale*_*lex 8

isnantrue当列包含数学上无效的数字时才返回,例如5/0.在任何其他情况下,包括字符串,它将返回false.如果要检查列是否包含数值,则需要定义自己的值,udf例如如下所示:

from pyspark.sql.functions import when,udf
from pyspark.sql.types import BooleanType

df = spark.createDataFrame([('33004', ''),('Muxia', None), ('Fuensanta', None)], ("Postal code", "PostalCode"))

def is_digit(value):
    if value:
        return value.isdigit()
    else:
        return False

is_digit_udf = udf(is_digit, BooleanType())

df = df.withColumn('PostalCode', when(is_digit_udf(df['Postal code']), df['Postal code']))
df = df.withColumn('Municipality', when(~is_digit_udf(df['Postal code']), df['Postal code']))
df.show()
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

+-----------+----------+------------+
|Postal code|PostalCode|Municipality|
+-----------+----------+------------+
|      33004|     33004|        null|
|      Muxia|      null|       Muxia|
|  Fuensanta|      null|   Fuensanta|
+-----------+----------+------------+  
Run Code Online (Sandbox Code Playgroud)

  • 缺少is_digit_udf上的括号 (2认同)