Python 从打印输出中获取表格(熊猫)
我运行了一个名为codeml的程序,该程序在python包ete3中实现 以下是codeml生成的模型打印: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
>>> 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…我将稍微清理一下。:)好的,我明白了,谢谢你的时间它帮助了很多:)好的,我明白了,谢谢你的时间它帮助了很多:)