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

标签 python regex pandas split

我有一个数据框,其中一列包含一个很长的字符串,其中包含很多信息,我需要将这些信息分解为单独的列并将它们添加到数据框中。与此类似 How to add a new column with multiple string contain conditions in python pandas other than using np.where?但我看不出如何适应。
我可以创建空列,但我不知道字符串是否可以提取元素,或者是否可以将其分成列。
例如数据行

0    Row 1 Ch475 Vi 17.0V BF27 Sclk 100ns 1in24 24segs
所需输出
RowNumber、Volts、Wfm、Sclk、Image、Segment
1 , 17 , BF27, 100 , 1in24, 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)

最佳答案

这是使用带有命名捕获组的正则表达式的快速解决方案。
正则表达式的好处超过 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

关于python - 如何在 Pandas 数据框单元格中提取部分字符串并在其中创建一个包含该字符串的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63847913/

相关文章:

python - 创建重复的圆x和y轴python

python - 用ansible中的多个值替换多个模式

python - Pandas 删除方括号和单引号

python - 使用 scapy 释放 DHCP

python - 如何在网格中排列 4 个 Seaborn 图(Python)?

python - 当我运行不带任何选项的 `twistd` 命令时,为什么我的扭曲插件没有出现?

c# - 字母数字小写和 "-",

regex - 从特定列的时间戳中删除毫秒

python - 合并这些数据框时的 Nan 值

python - 如何在 pandas 数据框中设置第二个?