2 回答
TA贡献1963条经验 获得超6个赞
这是使用正则表达式和命名捕获组的快速解决方案。
正则表达式的优点split:
有些人评论说不需要正则表达式,这是一个真实的说法。然而,从数据验证的角度来看,使用正则表达式有助于防止“杂散”数据悄悄进入。使用“盲”函数将split()数据分割为(一个字符);但如果源数据发生了变化怎么办?该split函数对此是盲目的。然而,使用正则表达式将有助于突出显示问题,因为模式根本不匹配。是的,您可能会收到一条错误消息 - 但这是一件好事,因为您会收到数据格式更改的警报,从而提供解决问题或更新正则表达式模式的机会。
来源数据:
模拟额外的行以进行演示。
0 Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs
1 Row 2 Ch475 Vi 17.1V BF27 Sclk 101ns 1in24 25segs
2 Row 3 Ch475 Vi 17.2V BF27 Sclk 102ns 1in24 26segs
3 Row 4 Ch475 Vi 17.3V BF27 Sclk 103ns 1in24 27segs
4 Row 5 Ch475 Vi 17.4V BF27 Sclk 104ns 1in24 28segs
代码:
import pandas as pd
import re
path = './orig_data.txt'
cols = ['rownumber', 'volts', 'wfm', 'sclk', 'image', 'segment']
exp = re.compile(r'^\d+\s+Row\s'
r'(?P<rownumber>\d+).*\s'
r'(?P<volts>\d+\.\d+)V\s'
r'(?P<wfm>\w+)\sSclk\s'
r'(?P<sclk>\d+)ns\s'
r'(?P<image>\w+)\s'
r'(?P<segment>\d+)segs.*$')
df = pd.read_csv(path, sep='|', header=None, names=['comment'])
df[cols] = df['comment'].str.extract(exp, expand=True)
输出:
comment rownumber volts wfm \
0 0 Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in2... 1 17.0 BF27
1 1 Row 2 Ch475 Vi 17.1V BF27 Sclk 101ns 1in2... 2 17.1 BF27
2 2 Row 3 Ch475 Vi 17.2V BF27 Sclk 102ns 1in2... 3 17.2 BF27
3 3 Row 4 Ch475 Vi 17.3V BF27 Sclk 103ns 1in2... 4 17.3 BF27
4 4 Row 5 Ch475 Vi 17.4V BF27 Sclk 104ns 1in2... 5 17.4 BF27
sclk image segment
0 100 1in24 24
1 101 1in24 25
2 102 1in24 26
3 103 1in24 27
4 104 1in24 28
TA贡献1804条经验 获得超8个赞
您需要将 Series obj 转换为字符串,然后将其拆分。之后您可以通过索引访问每个元素
df['Comments'].str.split(' ')
0 [Row, 1, Ch475, Vi, 17.0V, BF27, Sclk, 100ns, ...
df['Comments'].str.split(' ').str[0]
Out[7]:
0 Row
df['Comments'].str.split(' ').str[4]
Out[8]:
0 17.0V
如果您了解如何访问拆分中的每一列,您可以将其分配给数据框中的新行,例如:
df['RowNumber'] = df['Comments'].str.split(' ').str[1]
df['Volts'] = df['Comments'].str.split(' ').str[4]
添加回答
举报