Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从打印输出中获取表格(熊猫)_Python_Pandas_Ete3 - Fatal编程技术网

Python 从打印输出中获取表格(熊猫)

Python 从打印输出中获取表格(熊猫),python,pandas,ete3,Python,Pandas,Ete3,我运行了一个名为codeml的程序,该程序在python包ete3中实现 以下是codeml生成的模型打印: >>> print(model) Evolutionary Model fb.cluster_03502: log likelihood : -35570.938479 number of parameters : 23 sites inference : None sites cl

我运行了一个名为codeml的程序,该程序在python包ete3中实现

以下是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
因为我需要解析这些信息

您知道如何处理打印输出吗


谢谢你的帮助

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

为什么要打印? 你为什么首先要打印模型?这不是一种以编程方式访问模型内部的好方法,因为这是为供人阅读而设计的,并且您无法确定是否在用于打印的
\uuu str\uu()
方法中省略了模型的某些信息。你必须找出
进化模型是如何构造的,把这个结构转化成一个字典,然后用这个字典创建一个数据框架,我会说

首先看一看
模型。
模型。

如果您可以查看定义
进化模型
的代码,您当然可以直接查找
进化模型
的结构,并将其转换为字典

为什么是数据帧?
如果您只想“解析”模型,那么如果您只想获得对其属性的编程访问,那么将其放入数据帧中需要做很多额外的工作。如果要获取模型的
分支
属性的值,只需直接访问属性,例如
模型.branchs

问题中的隐含假设存在两个问题:

为什么要打印? 你为什么首先要打印模型?这不是一种以编程方式访问模型内部的好方法,因为这是为供人阅读而设计的,并且您无法确定是否在用于打印的
\uuu str\uu()
方法中省略了模型的某些信息。你必须找出
进化模型是如何构造的,把这个结构转化成一个字典,然后用这个字典创建一个数据框架,我会说

首先看一看
模型。
模型。

如果您可以查看定义
进化模型
的代码,您当然可以直接查找
进化模型
的结构,并将其转换为字典

为什么是数据帧? 如果您只想“解析”模型,那么如果您只想获得对其属性的编程访问,那么将其放入数据帧中需要做很多额外的工作。如果您想获取模型的
分支
属性的值,只需直接访问属性,例如
model.branchs

我查看了

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

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)
有更漂亮的方法可以做到这一点,但它完成了任务。

我看了一下

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

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)

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

您可以使用
StringIO
applymap

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

您可以使用
StringIO
applymap

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

可能最好的方法是将输出保存在临时文件中(考虑到大小),然后对其进行解析?可能最好的方法是将输出保存在临时文件中(考虑到大小),然后对其进行解析?我得到错误:Traceback(最近一次调用):file“”,第1行,在TypeError中:初始值必须为str或None,不是Model认为你可以考虑@乔纳森。ChanbAh的答案,改变我的代码<代码>…StrugIO(模型)…<代码> >…StrugIO(Model,Y.RePrSub)……/代码>我得到错误:Traceback(最近的调用最后一个):文件“,”第1行,在Type Error:NoalalSalk必须是STR或NONE,而不是Model I认为你可以考虑@乔纳森。将我的代码
…StringIO(model)…
更改为
…StringIO(model.\uuu repr\uuuuu())…
它工作起来很有魅力,谢谢!)(ps:was lines=s.split('\n')pHumm,我在这里遇到了一个小问题:名称比示例中的名称长得多,而且该方法似乎删除了名称的一部分,例如,我在模式中有一个名称:Platygaster_Orseolia,我在生成的数据帧中得到Platygaster_Orseolia…我将稍微清理一下。)它就像一个符咒,谢谢!:)(ps:was lines=s.split('\n')phum,我在这里遇到了一个小问题:名称比示例中的名称长得多,而且该方法似乎删除了名称的一部分,例如,我在模式中有一个名称:Platygaster_Orseolia,我在生成的数据帧中得到Platygaster_Orseolia…我将稍微清理一下。:)好的,我明白了,谢谢你的时间它帮助了很多:)好的,我明白了,谢谢你的时间它帮助了很多:)