Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在dataframe单元格中提取字符串的一部分,并使用该字符串创建一个新列_Python_Regex_Pandas_Split - Fatal编程技术网

Python 如何在dataframe单元格中提取字符串的一部分,并使用该字符串创建一个新列

Python 如何在dataframe单元格中提取字符串的一部分,并使用该字符串创建一个新列,python,regex,pandas,split,Python,Regex,Pandas,Split,我有一个数据框,其中一列包含一个长字符串,其中包含大量信息,我需要将这些信息分解为单独的列并添加到数据框中。它与此类似,但我看不出如何适应 我可以创建空列,但我不知道字符串是否可以提取元素,或者是否可以拆分为列 例如数据行 所需输出 行数、电压、Wfm、Sclk、图像、段 1,17,BF27,100,1in24,24 数据 代码 您需要将序列obj转换为字符串,然后将其拆分。之后,您可以通过其索引访问每个元素 df['Comments'].str.split(' ') 0 [Row, 1

我有一个数据框,其中一列包含一个长字符串,其中包含大量信息,我需要将这些信息分解为单独的列并添加到数据框中。它与此类似,但我看不出如何适应

我可以创建空列,但我不知道字符串是否可以提取元素,或者是否可以拆分为列

例如数据行

所需输出

行数、电压、Wfm、Sclk、图像、段

1,17,BF27,100,1in24,24

数据

代码


您需要将序列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]

下面是一个使用带有命名捕获组的正则表达式的快速解决方案

正则表达式相对于拆分的好处: 有些人评论说,regex不是必需的,这是一个真实的说法。然而,从数据验证的角度来看,使用正则表达式有助于防止“散乱”数据悄悄进入。使用'blind'
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
代码:
关于正则表达式提取。看看这是否有帮助。使用
expand
参数将按该名称将命名组提取到列中。我使用该参数来处理df['Image']=df['Comments'].str.extract(r'(1in24)),看起来我需要组合多个正则表达式,我只是看了一些类似的问题,看起来像是胡说八道——可能需要一个周末的时间才能让我清醒过来。不用担心。我现在给你准备些东西。我想你根本不需要正则表达式。使用
expand=True
拆分空格上的字符串,并处理您想要保留的列,删除不需要的列我从Packt购买了一本关于掌握python正则表达式的书,因为我从未见过像exp块中那样的代码,我认为学习正则表达式很难,但值得一读,谢谢S3DEVI发现了我需要更改的内容,我在文本文件中的数据在注释字段中的“行”车之前没有任何车,一旦我从您的exp块的第一行中取出这些车,一切都会很好地工作。阅读第一章得到了回报,谢谢你,非常高兴听到它对你有用,甚至更高兴听到你能够调试表达式以删除前导空格。干得好!如果你经常处理文本,你肯定会感谢自己对正则表达式的良好掌握。我经常用它来调试表达式。
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]
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