为了账号安全,请及时绑定邮箱和手机立即绑定

使用python将部分文件文本读入pandas数据框

使用python将部分文件文本读入pandas数据框

MMTTMM 2022-11-01 17:03:13
例如,我有以下格式的数据文本:HEADER NODE DATA, AIR            -10000,    15.,    -1.0HEADER CONDUCTOR DATA, AIR            1,    AIR.10000,    S25D.1,    56.84441         $ AIR CONV            2,    AIR.10000,    S25D.2,    56.45712         $ AIR CONV            3,    AIR.10000,    S25D.3,    53.35623         $ AIR CONV            4,    AIR.10000,    S25D.4,    45.09633         $ AIR CONV            5,    AIR.10000,    S25D.9,    77.00067         $ AIR CONV            6,    AIR.10000,    S25D.10,    80.35013         $ AIR CONV            7,    AIR.10000,    S25D.11,    50.4933         $ AIR CONV            8,    AIR.10000,    S25D.12,    91.61026         $ AIR CONV            9,    AIR.10000,    S25D.13,    53.75025         $ AIR CONV            10,    AIR.10000,    S25D.14,    75.68577         $ AIR CONV            11,    AIR.10000,    S25D.15,    110.0111         $ AIR CONV            12,    AIR.10000,    S25D.16,    114.7913         $ AIR CONV            13,    AIR.10000,    S25D.17,    81.12207         $ AIR CONV            14,    AIR.10000,    S25D.18,    72.80061         $ AIR CONV            15,    AIR.10000,    S25D.19,    72.21327         $ AIR CONV            16,    AIR.10000,    S25D.20,    90.99183         $ AIR CONV            17,    AIR.10000,    S25D.21,    66.35648         $ AIR CONV            18,    AIR.10000,    S25D.22,    76.9787         $ AIR CONV            19,    AIR.10000,    S25D.23,    52.46601         $ AIR CONV            20,    AIR.10000,    S25D.24,    68.30105         $ AIR CONV            21,    AIR.10000,    S25D.25,    114.0903         $ AIR CONV            22,    AIR.10000,    S25D.26,    70.51425         $ AIR CONV            23,    AIR.10000,    S25D.27,    36.39104         $ AIR CONV我想将其读入熊猫数据框以进行进一步分析。如您所见,每个子集的标题和数据格式都不同。我想使用 re 模块和 pandas 将数据读入框架,但不知道如何以最有效的方式进行。此外,您可以看到 AIR 字符串对两个标头都是通用的。在完整文件中会有更多这样的字符串,所以我想为每个字符串创建一个类,其属性(节点,导体)将是一个带有相应数据的 pd 数据框。
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

您可以尝试以下方法:

  1. 使用逐行读取文件f.readlines()

  2. 对于每一行,检查该行是否包含HEADER.

    • 如果是这种情况,这意味着这是一个新的子 df。将其添加到输出

    • else: 将当前行追加到当前子数据

  3. 将文本格式的 df 列表转换sub为 pandas 数据框。这个讨论解释了如何。笔记:

    • 将任何“ ,”与“ ,*”匹配

    • 使用匹配任何所有2 个或更多空间"\s{2,}

    • 使用的正则表达式是,*\s{2,}指:

    • 该参数header=None是必需的,第一行将用于添加列名称。


完整代码

# import modules

import pandas as pd

from io import StringIO


out = []

with open("data.txt", "r") as f:

    sub = ""

    for line in f.readlines():

        if "HEADER" in line:

            # Skip first insertion

            if sub != "":

                out.append(sub)

                sub = ""

        else: sub += line

    # Append last sub (outside for loop)

    out.append(sub)


# "out" is a list of pandas dataframes

out = [pd.read_csv(StringIO(o), sep=r",*\s{2,}", header=None, engine="python") for o in out]

print(out[0])

#        0     1    2

# 0 -10000  15.0 -1.0


print(out[1])

#      0          1         2          3           4

# 0    1  AIR.10000    S25D.1   56.84441  $ AIR CONV

# 1    2  AIR.10000    S25D.2   56.45712  $ AIR CONV

# 2    3  AIR.10000    S25D.3   53.35623  $ AIR CONV

# 3    4  AIR.10000    S25D.4   45.09633  $ AIR CONV

# 4    5  AIR.10000    S25D.9   77.00067  $ AIR CONV

# ..  ..        ...       ...        ...         ...

# 89  90  AIR.10000  S25D.122  133.79200  $ AIR CONV

# 90  91  AIR.10000  S25D.123  194.22270  $ AIR CONV

# 91  92  AIR.10000  S25D.124  116.83720  $ AIR CONV

# 92  93  AIR.10000  S25D.125  125.51610  $ AIR CONV

# 93  94  AIR.10000  S25D.126   54.22872  $ AIR CONV


# [94 rows x 5 columns]

print(out[1].columns)

# Int64Index([0, 1, 2, 3, 4], dtype='int64')


查看完整回答
反对 回复 2022-11-01
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信