如何在Pandas DataFrame的A列实现特定字符串合并转换?
Pandas DataFrame字符串特定格式转换
需求说明
需对DataFrame的A列字符串执行以下转换规则:
- 识别每个
()包裹的子串,若子串包含逗号:- 将逗号分隔的两部分拆分(如
A|B|C,D拆为A|B|C和D;A,B|C|D拆为A和B|C|D) - 将其中一部分的每个元素与另一部分元素两两拼接(空格分隔),再用
|连接成新子串
- 将逗号分隔的两部分拆分(如
- 括号内无逗号的子串保持原样
示例转换:(A|B|C,D)|(A,B|C|D)|(B|C|D) → (D A|D B|D C)|(A B|A C|A D)|(B|C|D)
示例DataFrame
import pandas as pd data = {'A': [ '(A|B|C,D)|(A,B|C|D)|(B|C|D)'], 'B(Expected)': [ '(D A|D B|D C)|(A B|A C|A D)|(B|C|D)'] } df = pd.DataFrame(data) print(df)
已尝试的无效方法
方法1:简单字符替换
df['B(Expected)'] = df['A'].apply(lambda x: x.replace("|", " ").replace(",", "|") if "|" in x and "," in x else x)
仅做字符替换,无法实现元素两两合并的逻辑,结果不符合预期。
方法2:拆分后拼接
# Split the string by the pipe character df['string'] = df['string'].str.split('|') df['string'] = df['string'].apply(lambda x: '|'.join([' '.join(i.split(' ')) for i in x]))
未针对括号内的逗号做处理,逻辑偏离需求,无法得到正确结果。
正确实现方案
通过正则匹配括号内的分组,针对性处理含逗号的子串:
import re import pandas as pd def process_group(match): # 获取括号内的内容 group_content = match.group(1) if ',' not in group_content: # 无逗号,直接返回原格式 return f'({group_content})' # 按逗号拆分两部分 part1, part2 = group_content.split(',', 1) # 拆分每部分的元素列表 items1 = part1.split('|') items2 = part2.split('|') # 根据元素数量决定拼接顺序 if len(items1) == 1 and len(items2) > 1: # 左部分是单元素,拼接为「单元素 + 空格 + 右部分元素」 combined = [f'{items1[0]} {item}' for item in items2] elif len(items2) == 1 and len(items1) > 1: # 右部分是单元素,拼接为「单元素 + 空格 + 左部分元素」 combined = [f'{items2[0]} {item}' for item in items1] else: # 两部分都是多元素时,生成所有笛卡尔积组合(左元素在前) combined = [f'{x} {y}' for x in items1 for y in items2] # 重新组合为括号包裹的格式 return f'({"|".join(combined)})' # 应用转换逻辑到A列 df['B(Result)'] = df['A'].apply(lambda x: re.sub(r'\((.*?)\)', process_group, x)) # 查看结果 print(df)
逻辑说明
process_group函数:处理单个括号内的内容,判断是否含逗号:- 无逗号则直接返回原括号格式
- 有逗号则拆分两部分,根据元素数量确定拼接顺序,生成两两合并后的字符串
re.sub(r'\((.*?)\)', process_group, x):匹配所有括号内的子串,调用处理函数替换原内容- 通过
apply将转换逻辑批量应用到DataFrame的A列
内容的提问来源于stack exchange,提问作者Jawed Sheikh
相关产品推荐
相关产品推荐

