You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

逻辑说明

  1. process_group函数:处理单个括号内的内容,判断是否含逗号:
    • 无逗号则直接返回原括号格式
    • 有逗号则拆分两部分,根据元素数量确定拼接顺序,生成两两合并后的字符串
  2. re.sub(r'\((.*?)\)', process_group, x):匹配所有括号内的子串,调用处理函数替换原内容
  3. 通过apply将转换逻辑批量应用到DataFrame的A列

内容的提问来源于stack exchange,提问作者Jawed Sheikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:05:24