为了账号安全,请及时绑定邮箱和手机立即绑定

如何提取 pandas 数据框单元格中的字符串的一部分并创建一个包含该字符串的新列

如何提取 pandas 数据框单元格中的字符串的一部分并创建一个包含该字符串的新列

慕桂英3389331 2023-07-27 14:03:55
我有一个数据框,其中一列包含一个很长的字符串,其中包含很多信息,我需要将这些信息分解为单独的列并将它们添加到数据框中。我可以创建空列,但我不知道字符串是否可以提取元素或者是否可以将其分成列。例如数据行0    Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs所需输出行号、伏特、Wfm、Sclk、图像、段1 , 17 , BF27 , 100 , 1in24 , 24数据                                              Comments  Image0    Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs      01    Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs      02    Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs      03    Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs      04    Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs      0..                                                 ...    ...706  Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs      0707  Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs      0708  Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs      0709  Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs      0710  Row 2 Ch475 Vi 17.5V BF27 Sclk 100ns 1in24 24segs      0代码import pandas as pdimport numpy as nppath = "/Users/.../Desktop/tk_gui_grid/"file = "orig_data.txt"filepath = path+filedf = pd.read_csv(filepath, sep='\t', lineterminator='\r')com = df.loc[:,['Comments']]dfLen = len(com)image = [0]*dfLencom['Image'] = imageprint(com)
查看完整描述

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


查看完整回答
反对 回复 2023-07-27
?
胡说叔叔

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]


查看完整回答
反对 回复 2023-07-27
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信