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

如何用Python移除pandas DataFrame双引号间的|分隔符?

解决Pandas DataFrame中双引号内竖线的移除问题

问题分析

你尝试的df.replace(r'".*?"', lambda m: m.group().replace("|", ""), regex=True)未生效,核心原因是Pandas的replace在正则模式下默认是匹配整个元素进行替换,而非元素内部的子串匹配。只有当某个元素完全是"..."格式时才会触发替换,显然大部分字段不符合这个条件,因此没有效果。

正确解决方案

第一步:确保数据正确读取

首先读取文本时必须指定quotechar='"',让Pandas识别双引号包裹的内容为单个字段,避免把引号内的|当成列分隔符:

import pandas as pd

# 从文件读取(如果是字符串则用StringIO模拟)
df = pd.read_csv(
    "your_data_file.csv",
    sep="|",
    header=None,
    quotechar='"',
    skipinitialspace=True  # 可选:移除字段前后多余空格
)

第二步:移除双引号内的竖线

推荐两种可靠的方式:

方式1:用applymap结合正则子串替换

通过遍历每个元素,精准匹配双引号内的内容并替换其中的|:

import re

def clean_pipe_in_quotes(value):
    # 匹配双引号包裹的内容,替换内部的|为空
    return re.sub(
        r'"([^"]*)"',
        lambda match: '"' + match.group(1).replace("|", "") + '"',
        str(value)
    )

# 对所有元素应用清理函数
df = df.applymap(clean_pipe_in_quotes)

方式2:优化后的replace写法

如果坚持用replace,需要调整正则为匹配双引号内的子串,而非整个元素:

df = df.replace(
    r'(?<=")[^"]*(?=")',  # 匹配双引号之间的内容(不包含引号本身)
    lambda m: m.group().replace("|", ""),
    regex=True
)

验证效果

处理后,原本的"It's a nice | garden"会变为"It's a nice garden",其他不含引号的字段不受影响。

完整示例代码

import pandas as pd
import re
from io import StringIO

# 模拟你的数据
sample_data = """Details|145|Sam's Garden|Retail|12.0|"It's a nice | garden"| USD|||||||||||||||||||||||||||
Details|200|That's my thing|Retail|23.4|"Not so | great"|EUR|||||||||||||||||||||||||||"""

# 读取数据
df = pd.read_csv(
    StringIO(sample_data),
    sep="|",
    header=None,
    quotechar='"',
    skipinitialspace=True
)

# 清理引号内的|
df = df.applymap(clean_pipe_in_quotes)

# 查看处理后的目标列(索引5)
print(df.iloc[:, 5])

输出结果:

0    "It's a nice  garden"
1      "Not so  great"
Name: 5, dtype: object

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:53:31