替换为正则表达式或 pandas 数据框中的任何其他内容

Replacement with regex or anything else in pandas dataframe

我想管理从多方收到的数据并将其转换为结构化数据,以便在我们的系统中实现统一。

例如,我收到这样的数据:

  1. 标称直径 1-13 x 0.5 毫米
  2. 公称直径 10 毫米
  3. 外径15mm
  4. 头径 9.00 毫米
  5. 直径 208/20 毫米高度 218 毫米

目标是按顺序检索此输出

  1. M1-13x0.5
  2. M10
  3. M15
  4. M9
  5. M208/20 H28

我想我会用多个正则表达式来做,然后替换它

df['diameter'] = df['New_size'].str.findall('^nominal diameter\s([\S]+)\sx\s([\S]+)\smm$')
df['diam2'] = 'Nom.M'+df['diameter'].str[0].str[0]+'x'+df['diameter'].str[0].str[1]

df['diameter'] = df['New_size'].str.findall('^nominal diameter\s([\S]+)\smm$')
df['diam2'] = 'Nom.M'+df['diameter'].str[0]

但这只在搜索直径时有帮助,在示例 5 中我需要再次 运行 它并以某种方式加入以增加高度…

有没有办法循环遍历数据并像 Excel + regex 中那样替换为 regex? 还是我的计划完全愚蠢,有更好的方法可以做到这一点?

我想到了将所有内容拆分成多个部分并逐字替换的计划。 然后只加入那些我认为有必要的信息。但实际上我似乎太复杂了 谢谢!

我只使用一系列正则表达式:

df['new_col'] = (
    df['col']
    .str.replace(r'.*nominal diameter ([\d-]+) x ([\d.]+) mm.*', r'Mx', regex=True)
    .str.replace(r'.*nominal diameter ([\d.]+) mm.*', r'M', regex=True)
    .str.replace(r'.*for external diameter ([\d.]+)mm.*', r'M', regex=True)
    .str.replace(r'.*head dm ([\d.]+) mm.*', r'M', regex=True)
    .str.replace(r'.*diameter ([\d./]+) mm height ([\d.]+) mm.*', r'M H', regex=True)
)

输出(之前):

>>> df = pd.DataFrame({'d':['nominal diameter 1-13 x 0.5 mm','nominal diameter 10 mm','for external diameter 15mm','head dm 9.00 mm','diameter 208/20 mm height 218 mm',]})
>>> df
                                col
0    nominal diameter 1-13 x 0.5 mm
1            nominal diameter 10 mm
2        for external diameter 15mm
3                   head dm 9.00 mm
4  diameter 208/20 mm height 218 mm

输出(之后):

>>> df
                                col       new_col
0    nominal diameter 1-13 x 0.5 mm     M1-13x0.5
1            nominal diameter 10 mm           M10
2        for external diameter 15mm           M15
3                   head dm 9.00 mm         M9.00
4  diameter 208/20 mm height 218 mm  M208/20 H218

使用这种类型的编辑,您不能在第一次就做到绝对,尤其是在 df 很大且文本多样的情况下。上演。

选项 1: 替换模式而不是目标子字符串

替换 df 中的值。首先替换除 x 之外的所有字母,然后替换 space 和数字之前的任何内容。然后从字符串的开头替换数字之前的所有非数字。然后替换所有点后跟 2 个零

df['text_edited'] = df.replace(regex={'[a-wy-z]+\s(?=\d)': 'H', '^[\D]+(?=\d)': 'M', 'mm': '', '.00':''})

     

                   text                text_edited
0    nominal diameter 1-13 x 0.5 mm    M1-13 x 0.5 
1            nominal diameter 10 mm            M10 
2        for external diameter 15mm             M15
3                   head dm 9.00 mm             M9 
4  diameter 208/20 mm height 218 mm  M208/20  H218

选项 2: 替换目标子字符串

我假设您的主要目标是用首字母替换直径和高度。这样做,如果有任何不需要的残差会显着改变属性的含义,请进一步编辑新列

df['text_edited'] = df.replace(regex={'diameter\s|dm\s': 'M','height\s': 'H','[^MHx0-9\W]':' ', '.00':''})



df['text_edited'] = df['text_edited'].str.strip().str.replace('^[x]','', regex=True)



                    text                 text_edited
0    nominal diameter 1-13 x 0.5 mm      M1-13 x 0.5
1            nominal diameter 10 mm              M10
2        for external diameter 15mm              M15
3                   head dm 9.00 mm               M9
4  diameter 208/20 mm height 218 mm  M208/20    H218