以可变格式在熊猫中分离数据

问题描述 投票:0回答:1

我有一个txt文件,该文件是另一个建模程序的输出,其中它一次查看一个建模节点的参数。数据输出类似于以下内容。我的问题是数据以单个列的形式出现,并偶尔被新的标题破坏,然后该列的第一部分重复(时间),但是第二部分是新的。我想做两件事:

1)将数据分为节点的时间和数据两列。然后将节点标签添加为第一列。

2)稍后,该节点还有另一个参数,而不是紧随其后的是信息形式为数据2节点(XX,XX)的形式,该参数与上一个相同。

这将给我最后四列,第一列是重复的节点ID,第二列是时间,第三列是数据参数1,第四列是匹配的数据参数2。

我在下面提供了数据的一小部分示例,但是输出几乎超过了1,000,000行,因此使用pandas或其他python功能来操纵数据会很好。

感谢您的帮助!

Name  20 vs   2
----------------------------------

   time                    Data 1 Node(  72,  23)

     ---------------------      ---------------------
          4.1203924E-003            -3.6406431E-005
          1.4085015E-002            -5.8257871E-004
          2.4049638E-002             6.8743013E-004
          3.4014260E-002             8.2296302E-005
          4.3978883E-002            -1.2276627E-004
          5.3943505E-002             1.9813024E-004
....
Name  20 vs   2
----------------------------------
  time                      Data 1 Node(  72,  24)

     ---------------------      ---------------------
          4.1203924E-003            -3.6406431E-005
          1.4085015E-002            -5.8257871E-004
          2.4049638E-002             6.8743013E-004
          3.4014260E-002             8.2296302E-005
          4.3978883E-002            -1.2276627E-004
          5.3943505E-002             1.9813024E-004
python-3.x pandas numpy
1个回答
0
投票

因此,经过大量的谷歌搜索后,我设法将其拼凑在一起。我正在查看的数据是空格分隔的,所以我在熊猫中使用了固定文件宽度读取方法,然后查看了列表中一些已知元素的索引,并使用它们将数据分解为两个数据帧,我可以合并后处理。我删除了这些行和NaN值,因为它们对我而言并不重要。随后,乐趣开始于实际使用数据。

    import pandas
    widths = [28, 27 ]
    df = pd.read_fwf(filename, widths=widths, names=["Times", "Items"])
    data = df["Items"].astype(str)
    index1 = data.str.contains('Data 1').idxmax()
    index2 = data.str.contains('Data 2').idxmax()

    df2 = pd.read_fwf(filename, widths=widths, skiprows=index1, skipfooter = (len(df)-index2), header = None, names=["Times", "Prin. Stress 1"])
    df2 = pd.read_fwf(filename, widths=widths, skiprows=index2, header = None, names=["Times", "Prin. Stress 2"])

    df2["Prin. Stress 2"] = df3["Prin. Stress 2"]
    df2 = df2[~df2["Times"].str.contains("---")] # removes lines ----
    df2.dropna(inplace = True)
© www.soinside.com 2019 - 2024. All rights reserved.