替换为正则表达式或 pandas 数据框中的任何其他内容
Replacement with regex or anything else in pandas dataframe
我想管理从多方收到的数据并将其转换为结构化数据,以便在我们的系统中实现统一。
例如,我收到这样的数据:
- 标称直径 1-13 x 0.5 毫米
- 公称直径 10 毫米
- 外径15mm
- 头径 9.00 毫米
- 直径 208/20 毫米高度 218 毫米
目标是按顺序检索此输出
- M1-13x0.5
- M10
- M15
- M9
- 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
我想管理从多方收到的数据并将其转换为结构化数据,以便在我们的系统中实现统一。
例如,我收到这样的数据:
- 标称直径 1-13 x 0.5 毫米
- 公称直径 10 毫米
- 外径15mm
- 头径 9.00 毫米
- 直径 208/20 毫米高度 218 毫米
目标是按顺序检索此输出
- M1-13x0.5
- M10
- M15
- M9
- 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