在数据处理场景中,我们经常会遇到需要对Pandas数据框的字符串列进行拆分的任务,有时候拆分规则不是单一的,既要按照指定分隔符拆分,还要在大写字母的位置进行拆分,比如处理混合了分隔符和驼峰命名格式的字符串数据。本文将介绍具体的实现方法。

基础拆分方法回顾
Pandas本身提供了str.split方法用于按照指定分隔符拆分字符串列,该方法返回拆分后的列表,我们可以通过设置expand=True参数将结果展开为新的列。比如按照下划线拆分字符串列的基础用法如下:
import pandas as pd
# 构造测试数据
df = pd.DataFrame({
"str_col": ["abc_def_ghi", "jkl_mno_pqr", "stu_vwx_yz"]
})
# 按照下划线拆分字符串列
split_result = df["str_col"].str.split("_", expand=True)
print(split_result)
结合大写字母规则的复合拆分
当我们需要同时按照指定分隔符和大写字母规则拆分时,单纯使用str.split无法满足需求,此时可以结合正则表达式实现。核心思路是使用正则的零宽断言,匹配分隔符或者大写字母前面的位置作为拆分点。
比如我们需要按照下划线_或者大写字母的位置拆分字符串,对应的正则表达式可以写为_|(?=[A-Z]),其中_匹配下划线,(?=[A-Z])是正向零宽断言,匹配大写字母前面的位置,不会消耗字符。
我们可以通过str.split方法传入该正则表达式实现拆分,示例如下:
import pandas as pd
# 构造包含分隔符和大写字母的测试数据
df = pd.DataFrame({
"str_col": ["abc_DefGhi", "jkl_MnoPqr", "stu_VwxYz"]
})
# 按照下划线或者大写字母位置拆分
# 需要设置regex=True启用正则匹配
split_result = df["str_col"].str.split(r"_|(?=[A-Z])", expand=True)
print(split_result)
上述代码会先将下划线作为拆分点,再在大写字母D、G、M、P、V、Y前面进行拆分,最终得到拆分后的多列结果。
处理拆分后的空值问题
在使用上述正则拆分时,可能会出现拆分后存在空字符串的情况,比如字符串开头就是大写字母,或者连续出现分隔符和大写字母。我们可以通过后续处理过滤掉空值,或者调整正则表达式优化拆分逻辑。
比如如果希望避免拆分出空字符串,可以调整正则表达式为(?<=.)_|(?=[A-Z]),其中(?<=.)是反向零宽断言,确保下划线前面有字符才会作为拆分点,减少空值的产生。示例如下:
import pandas as pd
df = pd.DataFrame({
"str_col": ["_AbcDef", "Ghi_JklMno", "Pqr__Stu"]
})
# 优化后的正则拆分,减少空值
split_result = df["str_col"].str.split(r"(?<=.)_|(?=[A-Z])", expand=True)
print(split_result)
# 过滤拆分结果中的空字符串
# 先将展开的结果转换为列表,再过滤空值
split_list = df["str_col"].str.split(r"(?<=.)_|(?=[A-Z])")
filtered_list = [[item for item in sub_list if item != ""] for sub_list in split_list]
print(filtered_list)
拆分结果的后续处理
拆分完成后,我们可能需要将结果保存到原数据框中,或者对拆分后的列进行重命名。可以通过直接赋值的方式将拆分结果添加到原数据框,示例如下:
import pandas as pd
df = pd.DataFrame({
"str_col": ["abc_DefGhi", "jkl_MnoPqr", "stu_VwxYz"]
})
# 拆分并展开结果
split_df = df["str_col"].str.split(r"_|(?=[A-Z])", expand=True)
# 重命名拆分后的列
split_df.columns = [f"part_{i}" for i in range(split_df.shape[1])]
# 合并到原数据框
df = pd.concat([df, split_df], axis=1)
print(df)
常见注意事项
- 使用正则拆分时必须设置
regex=True,否则Pandas会将传入的字符串当作普通分隔符处理。 - 正则表达式中的零宽断言不会消耗字符,因此拆分后不会丢失大写字母或者分隔符相邻的内容。
- 如果字符串中包含多个连续的分隔符,拆分后可能会产生空字符串,需要根据实际业务需求决定是否过滤。
- 当处理大量数据时,正则拆分的性能会比普通分隔符拆分稍低,如果数据量极大可以考虑先预处理字符串再拆分。
正则拆分的核心是正则表达式的编写,开发者可以根据实际的拆分规则调整正则内容,比如如果需要同时按照多个分隔符拆分,可以将分隔符部分改为[_-]匹配下划线或者横杠。