【问题标题】:Split a series to several columns based on length in Python在 Python 中根据长度将一个系列拆分为几列
【发布时间】:2021-04-26 21:17:17
【问题描述】:

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

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 中做到这一点?

谢谢

梅尔努什

【问题讨论】:

    标签: python-3.x pandas dataframe series


    【解决方案1】:

    一个优雅的解决方案是:

    • 从大小列表开始(每个“段”中应包含多少个字符)。
    • 使用命名的捕获组创建(编译的)正则表达式模式, 每个都捕获规定数量的字符。
    • 使用 str.extract 从您的 Series 中提取所需的子字符串。 组名将用作输出列的名称。

    假设s是源系列,那么做的代码是:

    import re
    
    # Define size of each group
    sizes = [4, 4, 6, 5, 8, 8, 8, 8, 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

    【讨论】:

    • 我也想过 read_fwf (例如),但 OP 说他已经有一个带有这些字符串的 Series
    • 是的,那好吧。如果 Series 来自 csv 应该使用 pd.read_fwf, +1
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2022-01-19
    • 2022-12-09
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多