簡體   English   中英

如何有條件地根據列中字符串的長度從PySpark Dataframe StringType()列中刪除字符的子字符串?

[英]How to remove a substring of characters from a PySpark Dataframe StringType() column, conditionally based on the length of strings in columns?

我有一個帶有StringType()列的PySpark Dataframe,該列主要包含15個字符。 但是,某些行有11個字符。 例:

df = 
+--------------+--------+
|             code|state|
+--------------+--------+
|'334445532234553'|wa   |
|'332452132234553'|mn   |
|'45532234553'    |fl   |
|'679645532234553'|mo   |
|'918535532234553'|ar   |
|'174925532234553'|wi   |
|'45532234553'    |al   |
|'928405532234553'|ca   |
+--------------+--------+

我需要所有行都具有11個字符,最后4個字符從任何包含15個字符的行中刪除。 所以這是我想要的輸出:

df.show(8) = 
+-------------+-----+
|         code|state|
+-------------+-----+
|'33444553223'|wa   |
|'33245213223'|mn   |
|'45532234553'|fl   |
|'67964553223'|mo   |
|'91853553223'|ar   |
|'17492553223'|wi   |
|'45532234553'|al   |
|'92840553223'|ca   |
+-------------+-----+

到目前為止,我已經完成了此轉換,該轉換從我列中稱為“代碼”的所有行中刪除了最后四個字符:

from pyspark.sql.functions import substring, length, col, expr

df = df.withColumn("code",expr("substring(code, 1, length(code)-4)"))

因此,我需要做一些事情來使此條件取決於行中字符串的長度。

編輯在@gmds的幫助下,我找到了以下解決方案:

df.withColumn("code",expr("substring(code, 1, 11)"))

這個怎么樣:

df.withColumn('code', df['code'].substr(1, 11))

你的想法是對的; 只是當您確實需要一個常量時,才為子字符串的長度提供了一個變化的值。

您可以將內置長度函數與子字符串一起使用:

from pyspark.sql.functions import substring, length

df = df.withColumn("code", when(length(df.code) > 11, substring(df.code, 1, length(df.code) - 4)).otherwise(df.code))

我根據@gmds的輸入找到了問題的答案。 這里是:

df.withColumn("code",expr("substring(code, 1, 11)"))

這段代碼將11設置為常量,這意味着該列包含的值是11個字符還是15個字符,轉換后它們都將具有11個字符的常量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM