从打印输出获取表格(pandas)

2024-06-26 01:34:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python包ete3中运行了一个名为codeml的程序。你知道吗

以下是codeml生成的模型打印:

>>> print(model)
 Evolutionary Model fb.cluster_03502:
        log likelihood       : -35570.938479
        number of parameters : 23
        sites inference      : None
        sites classes        : None
        branches             : 
        mark: #0  , omega: None      , node_ids: 8   , name: ROOT
        mark: #1  , omega: 789.5325  , node_ids: 9   , name: EDGE
        mark: #2  , omega: 0.005     , node_ids: 4   , name: Sp1
        mark: #3  , omega: 0.0109    , node_ids: 6   , name: Seq1
        mark: #4  , omega: 0.0064    , node_ids: 5   , name: Sp2
        mark: #5  , omega: 865.5116  , node_ids: 10  , name: EDGE
        mark: #6  , omega: 0.005     , node_ids: 7   , name: Seq2
        mark: #7  , omega: 0.0038    , node_ids: 11  , name: EDGE
        mark: #8  , omega: 0.067     , node_ids: 2   , name: Sp3
        mark: #9  , omega: 999.0     , node_ids: 12  , name: EDGE
        mark: #10 , omega: 0.1165    , node_ids: 3   , name: Sp4
        mark: #11 , omega: 0.1178    , node_ids: 1   , name: Sp5

但由于它只是一个打印,我需要将这些信息放入一个表格中,例如:

Omega       node_ids       name 
None        8              ROOT
789.5325    9              EDGE
0.005       4              Sp1
0.0109      6              Seq1
0.0064      5              Sp2
865.5116    10             EDGE
0.005       7              Sp3
0.0038      11             EDGE
0.067       2              Sp3
999.0       12             EDGE
0.1165      3              Sp4
0.1178      1              Sp5

因为我需要分析这些信息。你知道吗

你知道如何处理打印输出吗?你知道吗

谢谢你的帮助。你知道吗


Tags: namenonenodeidsrootsitesmarkedge
3条回答

你的问题中隐含的假设有两个问题:

为什么要打印?你知道吗

你为什么一开始就打印模型?这不是以编程方式访问模型内部的好方法,因为这是为供人阅读而设计的,并且您无法确定是否在用于打印的__str__()方法中省略了模型的某些信息。你必须找出Evolutionary Model是如何构造的,把这个结构转换成一个字典,然后用pandas.DataFrame.from_dict从这个字典创建一个数据帧。你知道吗

首先看一下model.__dict__()model.__repr__()。你知道吗

如果您可以查看定义Evolutionary Model的代码,当然可以直接查找Evolutionary Model的结构并将其转换为字典。你知道吗

为什么选择数据帧?你知道吗

如果您只想“解析”模型,那么如果您只想获得对其属性的编程访问,那么将其放入数据帧中需要做很多额外的工作。只要直接访问属性,例如model.branches,如果您想获得模型的branches属性的值。你知道吗

您可以使用StringIOapplymap

from io import StringIO
import pandas as pd

df = pd.read_csv(StringIO(model.__repr__()), skiprows=6, names=['mark', 'omega', 'node_ids', 'name'])
df = df.applymap(lambda x: x.split(":")[1])

输出:

    mark    omega       node_ids    name
0   #0      None        8           ROOT
1   #1      789.5325    9           EDGE
2   #2      0.005       4           Sp1
3   #3      0.0109      6           Seq1
4   #4      0.0064      5           Sp2
5   #5      865.5116    10          EDGE
6   #6      0.005       7           Seq2
7   #7      0.0038      11          EDGE
8   #8      0.067       2           Sp3
9   #9      999.0       12          EDGE
10  #10     0.1165      3           Sp4
11  #11     0.1178      1           Sp5

我看了看underlying code in model.py

似乎您可以使用s = model.__str__()来获得这个打印输出的字符串。在那里,您可以使用标准的字符串操作来解析字符串。我不知道字符串的确切形式,但您的代码可能如下所示:

import pandas as pd

lines = s.split('\\n')

lst = []
first_idx = 6  # Skip the lines that are not of interest.
names = [field[:field.index(':')].strip() for field in lines[first_idx].split(',')]

for line in lines[first_idx:]:  
    if line:
        row = [field[field.index(':')+1:].strip().strip("#") for field in line.split(',')]
        lst.append(row)

df = pd.DataFrame(lst, columns=names)

有更好的方法可以做到这一点,但它可以完成任务。你知道吗

相关问题 更多 >