
在数据处理中,我们经常需要将包含复合信息的字符串列拆分为多个独立的列。当拆分条件简单时,例如按第一个或最后一个特定字符进行拆分,pandas提供了str.split()或str.rsplit()等便捷方法。然而,当拆分条件变得复杂,例如要求分隔符必须满足特定上下文条件时,这些简单的方法就显得力不从心。
本教程要解决的问题是:在一个包含字符串的Pandas列中,我们需要找到最后一个由“ - ”连接,并且其后部分全部由大写字母(可能包含空格和短横线)组成的分割点,然后将字符串拆分为两部分。例如,"Carlos - George - ESTE BAN - BOM"应该被拆分为"Carlos - George"和"ESTE BAN - BOM"。
我们来看一个示例DataFrame:
import pandas as pd
df = pd.DataFrame({
'Value': ['Juan-Diva - HOLLS', 'Carlos - George - ESTE BAN - BOM', 'Javier Plain - Hotham Ham - ALPINE', 'Yul - KONJ KOL MON'],
})
print("原始DataFrame:")
print(df)期望的输出结果如下:
First Last 0 Juan-Diva HOLLS 1 Carlos - George ESTE BAN - BOM 2 Javier Plain - Hotham Ham ALPINE 3 Yul KONJ KOL MON
尝试使用str.split()或str.rsplit()等传统方法,往往难以满足这种复杂的条件拆分需求。
str.split(' - ', n=1, expand=True): 这会根据第一个“ - ”进行拆分,显然不符合要求。
# df[['First', 'l']] = df['Value'].str.split(' - ', n=1, expand=True)
# print(df)
# 结果: Juan-Diva | HOLLS, 但 Carlos - George - ESTE BAN - BOM 会被拆成 Carlos | George - ESTE BAN - BOMstr.rsplit(' - ', n=1, expand=True): 这会根据最后一个“ - ”进行拆分,但没有考虑其后是否为大写字母的条件。
# df[["First", "Last"]] = df["Value"].str.rsplit(" - ", n=1, expand=True)
# print(df)
# 结果: Carlos - George - ESTE BAN | BOM,不符合预期简单正则表达式: 如果正则表达式不够精确,也可能导致错误匹配。例如,r'(.*?)\s*-\s*([A-Z]+(?:\s*-?\s*[A-Z]+)*)' 可能会在第一个匹配到大写字母的地方就停止非贪婪匹配,导致结果不准确。
这些方法都无法在满足“最后一个”和“后面是大写字母”的双重条件时进行精确拆分。
解决此类问题的最佳方法是利用Pandas的str.extract()方法,结合一个能够精确匹配所需模式的正则表达式。str.extract()能够从字符串中提取出与正则表达式中捕获组匹配的部分,并直接将其放入新的DataFrame列中。
核心的正则表达式模式是: r'(.*?)\s*-\s*([A-Z]+(?:\s*-?\s*[A-Z]+)*)$'
我们来逐一解析这个正则表达式的各个部分:
*`(.?)`**:
\s*-\s*:
*`([A-Z]+(?:\s-?\s[A-Z]+))`**:
$:
将上述正则表达式应用于df['Value']列:
# 应用正则表达式进行提取
df[["First", "Last"]] = df["Value"].str.extract(r'(.*?)\s*-\s*([A-Z]+(?:\s*-?\s*[A-Z]+)*)$')
print("\n拆分后的DataFrame:")
print(df)运行结果:
原始DataFrame:
Value
0 Juan-Diva - HOLLS
1 Carlos - George - ESTE BAN - BOM
2 Javier Plain - Hotham Ham - ALPINE
3 Yul - KONJ KOL MON
拆分后的DataFrame:
First Last
0 Juan-Diva HOLLS
1 Carlos - George ESTE BAN - BOM
2 Javier Plain - Hotham Ham ALPINE
3 Yul KONJ KOL MON可以看到,str.extract()结合精确的正则表达式成功地按照预期将列进行了拆分。
本教程展示了如何利用Pandas的str.extract()方法结合精心构造的正则表达式,来解决DataFrame列中基于复杂条件进行字符串拆分的挑战。通过理解非贪婪匹配、捕获组以及锚点在正则表达式中的作用,我们可以精确地定位所需的拆分点,从而高效地从原始数据中提取出结构化的信息。这种方法在处理非标准或复杂格式的文本数据时尤其强大和灵活。
以上就是使用正则表达式在Pandas中按条件拆分列:定位最后一个大写字母前的分隔符的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号