Dataframe 如何从数据帧的字符串中获取数字

Dataframe 如何从数据帧的字符串中获取数字,dataframe,pyspark,apache-spark-sql,Dataframe,Pyspark,Apache Spark Sql,我有一个数据帧: ID | program | --------|-----------| 53-8975 | null | 53-9875 | null | 53A7569 | | 53-9456 | XXXX | 53-9875 | | --------------------- ID和程序是字符串。 我想用字母K填充program列中的所有null或”,如果ID列中的第四位是9。 例如: 我有两个I

我有一个
数据帧

ID      |  program  |  
--------|-----------|
53-8975 |  null     |
53-9875 |  null     |
53A7569 |           | 
53-9456 |  XXXX     |
53-9875 |           |
---------------------
ID
程序
字符串
。 我想用字母
K
填充
program
列中的所有
null
,如果
ID
列中的第四位是
9
。 例如:

我有两个ID,第四个是9:53-9875和53-9456,程序列的值分别是:
null
“”

如果
ID
列中的
4位
9
,而
程序
null
,我如何用字母
K
填充

要成为我的数据帧:

ID      |  program  |  
--------|-----------|
53-8975 |  null     |
53-9875 |  K        |
53A7569 |           | 
53-9456 |  XXXX     |
53-9875 |   K       |
---------------------

因此,如果我们有您的原始数据帧:

df = spark.createDataFrame([("53-8975", None), ("53-9875", None), ("53A7569", ""), ("53-9456", "XXXX"), ("53-9875", "")], ["id", "program"])
df.show()
+-------+-------+
|     id|program|
+-------+-------+
|53-8975|   null|
|53-9875|   null|
|53A7569|       |
|53-9456|   XXXX|
|53-9875|       |
+-------+-------+
我们可以使用
when()创建一个转换,根据您的规范使用
program
或“k”。否则()


谢谢你的回答,事实上我是这样修改的,我使用了你的解决方案:output=(df.select(F.col('program'),F.col('ID'))。withColumn(“program”),F.when((F.col(“program”)==”)(isnull(F.col(“program”))和(F.col(“ID”)。substr(4,1)=“9”),lit(“K”)。否则(F.col(“program”)))我得到了这个错误:TypeError:“Column”对象不可调用请提供一些帮助?您的修改中的括号有问题,它应该像
output=(df.select(F.col('program'),F.col('ID'))。withColumn(“program”),F.when((F.col(“program”)=“”)(F.isnull(F.col(“program”))和(F.col(“ID”)。substr(4,1)=“9”),F.lit(“K”)。否则(F.col(“program”))
如果您认为答案有用,请接受答案并选择向上投票:)
from pyspark.sql.functions import *

programNullOrEmpty = (col("program") == "") | (isnull(col("program")))
id9 = col("id").substr(4,1) == "9"

df.withColumn("program", when(programNullOrEmpty & id9, lit("K"))
                         .otherwise(col("program")))\
    .show()

+-------+-------+
|     id|program|
+-------+-------+
|53-8975|   null|
|53-9875|      K|
|53A7569|       |
|53-9456|   XXXX|
|53-9875|      K|
+-------+-------+