python - 如何根据列中字符串的长度有条件地从 PySpark Dataframe StringType() 列中删除字符子串?

标签 python regex pyspark apache-spark-sql

我有一个 PySpark 数据框,其中的 StringType() 列主要包含 15 个字符。但是,有些行有 11 个字符。示例:

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

我需要所有行都包含 11 个字符,并从包含 15 个字符的任何行中删除最后 4 个字符。所以这是我想要的输出:

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

到目前为止,我进行了这种转换,它从名为“代码”的列中的所有行中删除了最后 4 个字符:

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

你的想法是对的;只是当您真正想要一个常量时,您为子字符串的长度提供了一个变化的值。

关于python - 如何根据列中字符串的长度有条件地从 PySpark Dataframe StringType() 列中删除字符子串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55778505/

相关文章:

python - 从左递归求解M位数字

javascript - 正则表达式替换不起作用

javascript - 如何在 Chrome 扩展中将 URL 与片段标识符匹配?

apache-spark - 何时使用 mapParitions 和 mapPartitionsWithIndex?

apache-spark - Spark magic 输出提交器设置无法识别

ssl - 使用 Pyspark 通过 SSL 连接到 DB2

python - 如何在 Visual Studio 中使用 python 设置相对路径?

python - 如何从 Django 中的查询中获取枚举结果?

python - 一般维数的多维网格

php - 替换所有*不*在 "\"标签内的 "<code>"字符