我有一个数据帧,其中一列包含一个长字符串,其中包含许多信息,我需要将这些信息分解为单独的列,并将它们添加到数据帧中。与此类似如何在python-panda中添加具有多个字符串包含条件的新列而不是使用np.where?但我不知道如何适应。
我可以创建空列,但我不知道字符串是否可以提取元素,或者是否可以将其分隔成列。
例如数据行
0 Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs
所需输出
行号、电压、Wfm、Sclk、图像、段
1、17、BF27、100、1i24、24
数据
Comments Image
0 Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs 0
1 Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs 0
2 Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs 0
3 Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs 0
4 Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs 0
.. ... ...
706 Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs 0
707 Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs 0
708 Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs 0
709 Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs 0
710 Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs 0
代码
import pandas as pd
import numpy as np
path = "/Users/.../Desktop/tk_gui_grid/"
file = "orig_data.txt"
filepath = path+file
df = pd.read_csv(filepath, sep='t', lineterminator='r')
com = df.loc[:,['Comments']]
dfLen = len(com)
image = [0]*dfLen
com['Image'] = image
print(com)
这里有一个使用带有命名捕获组的regex的快速解决方案。
regex相对于split
的优势:
有些人评论说regex不是必需的,这是一个正确的说法。然而,从数据验证的角度来看,使用正则表达式有助于防止"杂散"数据悄悄进入。使用"盲"split()
函数将数据拆分到(一个字符(;但是如果源数据发生了更改怎么办split
函数对此视而不见。然而,使用regex将有助于突出问题,因为模式根本不匹配。是的,您可能会收到一条错误消息,但这是一件好事,因为您会收到数据格式更改的警报,从而有机会解决问题或更新regex模式。
源数据:
模拟的其他行用于演示。
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+Rows'
r'(?P<rownumber>d+).*s'
r'(?P<volts>d+.d+)Vs'
r'(?P<wfm>w+)sSclks'
r'(?P<sclk>d+)nss'
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
您需要将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]