如何在PySpark中仅将数据集的第一个字母大写?(简单大写/句子大小写)



我需要清理几个字段:物种/描述通常是一个简单的大写字母,其中第一个字母是大写的。PySpark只有upper、lower和initcap(每个单词都大写(,这不是我想要的。https://spark.apache.org/docs/2.0.1/api/python/_modules/pyspark/sql/functions.html

Python有一个原生的capitalize((函数,我一直在尝试使用它,但对列的调用不正确。

fields_to_cap = ['species', 'description']
for col_name in fields_to_cap:
df = df.withColumn(col_name, df[col_name].captilize())

有没有一种方法可以轻松地将这些字段大写?

需要明确的是,我正试图将字段中的数据大写。这里有一个例子:

电流:"这是一个描述">

预期:"这是一个描述">

使用initcap

data = [
(1001, 'jana', 'yes'),
(1001, 'Jleo', 'no')
]
df = spark.createDataFrame(data, ['SID','species', 'description']).show()
+----+-------+-----------+
| SID|species|description|
+----+-------+-----------+
|1001|   jana|        yes|
|1001|   Jleo|         no|
+----+-------+-----------+

from pyspark.sql.functions import *
df.withColumn("species", initcap(col('species'))).withColumn("description", initcap(col('description'))).show()
+----+-------+-----------+
| SID|species|description|
+----+-------+-----------+
|1001|   Jana|        Yes|
|1001|   Jleo|         No|
+----+-------+-----------+

您可以使用一种变通方法,将第一个字母和其余字母分开,使第一个字母大写和小写成为其余字母,然后将它们连接回

import pyspark.sql.functions as F
df = spark.createDataFrame([[1, 'rush HouR'],
[2, 'kung-Fu Panda'],
[3, 'titaniC'],
[4, 'the Sixth sense']], schema="id int, title string")
df = df.withColumn('title_capitalize', F.concat(F.upper(F.expr("substring(title, 1, 1)")), 
F.lower(F.expr("substring(title, 2)"))))
df.show()
+---+---------------+----------------+
| id|          title|title_capitalize|
+---+---------------+----------------+
|  1|      rush HouR|       Rush hour|
|  2|  kung-Fu Panda|   Kung-fu panda|
|  3|        titaniC|         Titanic|
|  4|the Sixth sense| The sixth sense|
+---+---------------+----------------+

或者,如果你想坚持使用Python的.capitalize(),你可以使用UDF

from pyspark.sql.types import StringType
udf_capitalize  = F.udf(lambda x: str(x).capitalize(), StringType())
df = df.withColumn('title_capitalize', udf_capitalize('title'))

相关内容

  • 没有找到相关文章

最新更新