我有一個subclassOf層次結構,它可以被表示為一個資料框架。subjects是objects的子類。我想把它列印成一個縮進的串列,其中縮進意味著該術語是上面一行的術語的子類。我正在使用一個遞回函式,感覺我已經很接近了。我可以縮進,但我不認為我找到了縮進的正確位置(通過遞減prefix_level)。
如果這個問題沒有得到很好的組織,請原諒。我愿意接受任何解決方案。它不一定要建立在我所展示的基礎上。
import pandas as pd
current_direct_sco = pd.DataFrame(
{
"subject": {
986: "ENVO:01000025",
989: "ENVO:01000028",
990: "ENVO:01000029",
991: "ENVO:01000030",
1011: "ENVO:01000050",
1014: "ENVO:01000053",
1015: "ENVO:01000054",
1096: "ENVO:01000127",
1242: "ENVO:01000252",
1243: "ENVO:01000253",
},
"object": {
986: "ENVO:01000024",
989: "ENVO:01000024",
990: "ENVO:01000024",
991: "ENVO:01000024",
1011: "ENVO:01000029",
1014: "ENVO:01000030",
1015: "ENVO:01000030",
1096: "ENVO:01000024",
1242: "ENVO:00000873",
1243: "ENVO:00000873",
},
}
)
print(current_direct_sco)
| | subject | object|
|------|---------------|---------------|
| 986 | ENVO:01000025 | ENVO:01000024 |
| 989 | ENVO:01000028 | ENVO:01000024 |
990 | ENVO:01000029 | ENVO:01000024 | 990 ?
| 991 | ENVO:01000030 | ENVO:01000024 |
1011 | ENVO:01000050 | ENVO:01000029 | 1011 ?
| 1014 | ENVO:01000053 | ENVO:01000030 |
| 1015 | ENVO:01000054 | ENVO:01000030 |
| 1096 | ENVO:01000127 | ENVO:01000024 |
| 1242 | ENVO:01000252 | ENVO:00000873 !
| 1243 | ENVO:01000253 | ENVO:00000873 |
import igraph as ig
g = ig.Graph.TupleList(
current_direct_sco.itertuples(index=False), directed=True, vertex_name_attr="label")
)
# requires pycairo
ig.plot(g)
roots = list(set(current_direct_sco["object"]) - set(current_direct_sco["subject"))
print(roots)
['ENVO:00000873', 'ENVO:01000024']
def recurse_envo(starting_term)。
global prefix_level
global prefix_chunk
global current_prefix
print(current_prefix starting_term)。
current_children = list(
current_direct_sco["subject"].loc[current_direct_sco["object"] == start_term]
)
if len(current_children) > 0:
prefix_level = prefix_level 1:
current_prefix = prefix_chunk * prefix_level
for current_child in current_children:
recurse_envo(current_child)
for i in roots:
first_term = i
prefix_level =0
prefix_chunk = " "/span>
current_prefix = " "/span>
recurse_envo(first_term)
這就是輸出結果。
ENVO:00000873
ENVO:01000252
ENVO:01000253
ENVO:01000024
ENVO:01000025
ENVO:01000028
ENVO:01000029
ENVO:01000050
ENVO:01000030
ENVO:01000053
ENVO:01000054
ENVO:01000127
但它應該是這樣的(手繪的)。例如,ENVO:01000127不是ENVO:01000030的子類:
ENVO:00000873
ENVO:01000252
ENVO:01000253
ENVO:01000024
ENVO:01000025
ENVO:01000028
ENVO:01000029
ENVO:01000050
ENVO:01000030
ENVO:01000053
ENVO:01000054
ENVO:01000127
uj5u.com熱心網友回復:
你可以使用遞回:
data = {'subject': {986: 'ENVO:01000025', 989: 'ENVO:01000028', 990: 'ENVO:01000029', 991: 'ENVO:01000030', 1011: 'ENVO:01000050', 1014: 'ENVO:01000053', 1015: 'ENVO:01000054', 1096: 'ENVO:01000127', 1242: 'ENVO:01000252', 1243: 'ENVO:01000253'}, 'object': {986: 'ENVO:01000024', 989: 'ENVO:01000024', 990: 'ENVO:01000024', 991: 'ENVO:01000024', 1011: 'ENVO:01000029', 1014: 'ENVO:01000030', 1015: 'ENVO:01000030', 1096: 'ENVO:01000024', 1242: 'ENVO:00000873', 1243: 'ENVO:00000873'}}。
vals = [[data['subject'/span>][i], data['object'/span>][i]] for i in data['subject']] ]
def nest(n, c = 0) 。
return ((c*" ") n) ('' ifnot (k: =[nest(a, c 1) for a, b in vals if b == n] )
else '
' ("
".join(k)))
roots = {b for _, b in vals if all(j ! = b for j, _ in vals)} #can replace this definition with list(set(current_direct_sco["object"]) - set(current_direct_sco["subject"))
print('
'.join(nest(b) for b in roots)
輸出:
ENVO:01000024
ENVO:01000025
ENVO:01000028
ENVO:01000029
ENVO:01000050
ENVO:01000030
ENVO:01000053
ENVO:01000054
ENVO:01000127
ENVO:00000873
ENVO:01000252
ENVO:01000253
一個更簡單的nest的實作,使用一個生成器:
def nest(n, c = 0) 。
yield (c*") n
for a, b in vals:
if b == n:
yield from nest(a, c 1)
...
print('
'.join(i for b in roots for i in nest(b))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/321110.html
標籤:
下一篇:如何查找包含子串的字串的串列索引

