python - 如何将 Pyspark 中由某些字符分隔的每个单词大写?
问题描述
我目前正在使用 Pyspark,我面临一个看似简单的问题。
我想将每个单词的第一个字母大写,即使单词由以下列表中的字符分隔:
delimiter_list = [' ', '(', '+', '/', '-']
实际上,initcap
仅适用于由空白类型分隔的单词。
有没有有效的解决方案?以下是一些输入输出示例:
输入 | 输出 |
---|---|
巴登巴登 | 巴登-巴登 |
马克兰施塔特/勃兰登堡-基希默瑟 | 马克兰施塔特/勃兰登堡-基希默瑟 |
奥斯特罗马佐维茨基/比亚韦斯托克 | 奥斯特罗·马佐维茨基/比亚韦斯托克 |
解决方案
由于分隔符不同,您可以先添加一个通用分隔符,例如#
在列表中的每个字符之后delimiter_list
使用regexp_replace
:
regexp_replace(words, '(\\s|\\(|\\+|-|\\/)(.)', '$1#$2')
现在,您可以通过使用函数将每个元素大写来拆分#
和转换结果数组。最后,使用函数transform
连接数组元素以获取原始字符串:array_join
from pyspark.sql import functions as F
df1 = df.withColumn(
"words_capitalized",
F.expr(r"""
array_join(
transform(
split(regexp_replace(words, '(\\s|\\(|\\+|-|\\/)(.)', '$1#$2'), '#'),
x -> initcap(x)
),
""
)
""")
)
df1.show(truncate=False)
#+-----------------------------------+-----------------------------------+
#|words |words_capitalized |
#+-----------------------------------+-----------------------------------+
#|baden-baden |Baden-Baden |
#|markranstadt/brandenburg-kirchmöser|Markranstadt/Brandenburg-Kirchmöser|
#|ostrow mazowiecki/bialystok |Ostrow Mazowiecki/Bialystok |
#+-----------------------------------+-----------------------------------+
推荐阅读
- sql - count() 是否正确用于我的查询?
- angular - 基于 Angular 中的动态选择下拉菜单显示
- angular - Angular 8:如何从动态单选按钮获取选定的数据
- apache-flink - Flink 解决方案建议
- python - 对 Pandas 数据框(和 Numpy)进行子集就地更新的 Pythonic 方式是什么
- regex - 正则表达式操作和字符串替换 - sed 的替代品
- python - 验证字符串是否包含有效的 Python 代码
- c# - C# - 如何从字符串 'd MM YYYY HH:mm:ss AM/PM' 中仅获取日期部分
- java - 将用户输入 (char) 与其他 char 进行比较
- hyperledger-fabric - 成功打开测试网络但部署链码失败