问题描述
01 1ABCD E 1 4.011 3.952 7.456 -0.3096 1.0132 0.2794
02 1ABCD F 2 4.088 3.920 7.517 0.3839 -0.5482 -1.3874
...
我想根据长度将它分成 10 列:前 4 个字符包括空格 = 第 1 列,第二个 5 个字符 = 第 2 列,...,最后 8 个字符 = 第 10 列
结果应该是这样的:
column1 | column2 | column3 | .... | column10 |
---|---|---|---|---|
01 1 | ABCD | E | ..... | 0.2794 |
02 1 | ABCD | F | .... | -1.3874 |
我如何在 python 中做到这一点?
谢谢
Mehrnoosh
解决方法
一个优雅的解决方案是:
- 从大小列表开始(每个“段”中应该有多少个字符)。
- 使用命名的捕获组创建(编译的)正则表达式模式, 每个捕获指定数量的字符。
- 使用 str.extract 从您的 系列 中提取所需的子字符串。 组名将用作输出列的名称。
假设s是系列的源代码,代码如下:
import re
# Define size of each group
sizes = [4,4,6,5,8,8]
# Generate the pattern string and compile it
pat = re.compile(''.join([ f'(?P<Column{idx}>.{{{n}}})'
for idx,n in enumerate(sizes,start=1) ]))
# Generate the result
result = s.str.extract(pat)
结果是:
Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8 Column9 Column10
0 01 1 ABCD E 1 4.011 3.952 7.456 -0.3096 1.0132 0.2794
1 02 1 ABCD F 2 4.088 3.920 7.517 0.3839 -0.5482 -1.3874
但请注意,result 中的所有列都是 object 类型(实际上它们是字符串)。 因此,要对它们进行任何合理的处理,您可能应该:
- 从每列(前导和尾随)中去除空格,
- 将某些列转换为 int 或 float。