AttributeError: 'str' object has no attribute 'search_nodes' - Python

AttributeError: 'str' object has no attribute 'search_nodes' - Python

我已经使用 ete2 包构建了一棵树。现在我正在尝试编写一段代码,从树和 csv 文件中获取数据,并通过函数 fre 进行一些数据分析。 这是我使用的 csv 文件的示例:

PID Code    Value 
1    A1...   6
1    A2...   5
2    A....   4
2    D....   1
2    A1...   2
3    D....   5
3    D1...   3
3    D2...   5

这里是代码的简化版本

from ete2 import Tree
import pandas as pd
t= Tree("((A1...,A2...)A...., (D1..., D2...)D....).....;", format=1)
data= pd.read_csv('/data_2.csv', names=['PID','Code', 'Value'])
code_count = data.groupby('Code').sum()
total_patients= len(list (set(data['PID'])))
del code_count['PID']

############

def fre(code1,code2):
    code1_ancestors=[]
    code2_ancestors=[]
    for i in t.search_nodes(name=code1)[0].get_ancestors():
        code1_ancestors.append(i.name)
    for i in t.search_nodes(name=code2)[0].get_ancestors():
        code2_ancestors.append(i.name)
    common_ancestors = []
    for i in code1_ancestors:
        for j in code2_ancestors:
            if i==j:
                common_ancestors.append(i)
    print common_ancestors

####

for i in patients_list:
    a= list (data.Code[data.PID==patients_list[i-1]])
    #print a
    for j in patients_list:
        b= list (data.Code[data.PID==patients_list[j-1]])
        for k in a:
            for t in b:
                fre (k,t)

但是,出现了一个错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-12-f9b47fcec010> in <module>()
     38         for k in a:
     39             for t in b:
---> 40                 fre (k,t)

<ipython-input-12-f9b47fcec010> in fre(code1, code2)
     12     code1_ancestors=[]
     13     code2_ancestors=[]
---> 14     for i in t.search_nodes(name=code1)[0].get_ancestors():
     15         code1_ancestors.append(i.name)
     16     for i in t.search_nodes(name=code2)[0].get_ancestors():

AttributeError: 'str' object has no attribute 'search_nodes'

我尝试手动将所有可能的值传递给该函数,它成功了!但是,当我使用代码的最后一部分时,它引发了错误。

您正在使用 for 循环更改全局变量 't'。

如果你在每次调用你的函数之前打印出它的值,你会发现你在某个时候已经将它赋给了一个字符串。