在 Python 中根据长度将系列拆分为几列

问题描述

我有一个看起来像这样的系列:

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 类型(实际上它们是字符串)。 因此,要对它们进行任何合理的处理,您可能应该:

  • 从每列(前导和尾随)中去除空格,
  • 将某些列转换为 intfloat