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'返回
任何想法将不胜感激
isnan仅true当列包含数学上无效的数字时才返回,例如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)
| 归档时间: |
|
| 查看次数: |
7665 次 |
| 最近记录: |