【问题标题】:PySpark: How to check if a column contains a number using isnan [duplicate]PySpark:如何使用 isnan 检查列是否包含数字 [重复]
【发布时间】:2018-03-13 10:28:35
【问题描述】:

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

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

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

我尝试使用“isnan”作为我的理解,这将检查值是否不是数字,但这似乎不起作用。列类型应该是字符串才能工作吗?

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

> df2 = df.withColumn('PostalCode', when(isnan(df['Postal code']), df['Postal code']) 

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

任何想法将不胜感激

【问题讨论】:

  • df.withColumn("PostalCode", df.Postalcode.cast("int"))

标签: apache-spark pyspark


【解决方案1】:

isnan 仅在列包含数学上无效的数字(例如 5/0)时才返回 true。在任何其他情况下,包括字符串,它将返回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()

这作为输出:

+-----------+----------+------------+
|Postal code|PostalCode|Municipality|
+-----------+----------+------------+
|      33004|     33004|        null|
|      Muxia|      null|       Muxia|
|  Fuensanta|      null|   Fuensanta|
+-----------+----------+------------+  

【讨论】:

  • is_digit_udf 缺少括号
猜你喜欢
  • 2020-07-21
  • 2019-07-12
  • 1970-01-01
  • 2018-06-20
  • 2015-09-14
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多