python - 替换 pyspark 数据框中列名中的字符

标签 python apache-spark pyspark

我在 Pyspark 中有一个如下所示的数据框

df = spark.createDataFrame([(2,'john',1,1),
                            (2,'john',1,2),
                            (3,'pete',8,3),
                            (3,'pete',8,4),
                            (5,'steve',9,5)],
                           ['id','/na/me','val/ue', 'rank/'])

df.show()

+---+------+------+-----+
| id|/na/me|val/ue|rank/|
+---+------+------+-----+
|  2|  john|     1|    1|
|  2|  john|     1|    2|
|  3|  pete|     8|    3|
|  3|  pete|     8|    4|
|  5| steve|     9|    5|
+---+------+------+-----+

现在,在此数据框中,我想将 / 处的列名替换为 scrore _ 下的列名。但是,如果 / 出现在列名的开头或结尾,则删除 / 但不要替换为 _

我做了如下

for name in df.schema.names:
  df = df.withColumnRenamed(name, name.replace('/', '_'))


>>> df
DataFrame[id: bigint, _na_me: string, val_ue: bigint, rank_: bigint]


>>>df.show()
+---+------+------+-----+
| id|_na_me|val_ue|rank_|
+---+------+------+-----+
|  2|  john|     1|    1|
|  2|  john|     1|    2|
|  3|  pete|     8|    3|
|  3|  pete|     8|    4|
|  5| steve|     9|    5|
+---+------+------+-----+

我怎样才能达到下面我想要的结果

+---+------+------+-----+
| id| na_me|val_ue| rank|
+---+------+------+-----+
|  2|  john|     1|    1|
|  2|  john|     1|    2|
|  3|  pete|     8|    3|
|  3|  pete|     8|    4|
|  5| steve|     9|    5|
+---+------+------+-----+

最佳答案

尝试以 python 方式使用 正则表达式 replace(re.sub)。

import re
cols=[re.sub(r'(^_|_$)','',f.replace("/","_")) for f in df.columns]

df = spark.createDataFrame([(2,'john',1,1),
                            (2,'john',1,2),
                            (3,'pete',8,3),
                            (3,'pete',8,4),
                            (5,'steve',9,5)],
                           ['id','/na/me','val/ue', 'rank/'])

df.toDF(*cols).show()
#+---+-----+------+----+
#| id|na_me|val_ue|rank|
#+---+-----+------+----+
#|  2| john|     1|   1|
#|  2| john|     1|   2|
#|  3| pete|     8|   3|
#|  3| pete|     8|   4|
#|  5|steve|     9|   5|
#+---+-----+------+----+

#or using for loop on schema.names
for name in df.schema.names:
  df = df.withColumnRenamed(name, re.sub(r'(^_|_$)','',name.replace('/', '_')))

df.show()
#+---+-----+------+----+
#| id|na_me|val_ue|rank|
#+---+-----+------+----+
#|  2| john|     1|   1|
#|  2| john|     1|   2|
#|  3| pete|     8|   3|
#|  3| pete|     8|   4|
#|  5|steve|     9|   5|
#+---+-----+------+----+

关于python - 替换 pyspark 数据框中列名中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61808522/

相关文章:

Java、Spark、Sql2o、H2 : Could not acquire a connection from DataSource - IO Exception

python - PySpark 旋转

python - 尝试从 Github 页面抓取数据

apache-spark - 如何使用 Trigger.Once 选项在 Spark 3 Structured Streaming Kafka/File 源中配置背压

python - 从包含许多元素的列表中删除重复项

hadoop - Spark SQL : HiveContext don't ignore header

apache-spark - 使用 Spark insertInto 时出现 FileAlreadyExistsException

python - 遍历 Spark RDD

python - 跟踪 python 源文件中的更改?

python - 错误代码 : InvalidBlobType when appending to a blob