如何用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
相关产品推荐
相关产品推荐

