Python создает иерархию с помощью цикла for - PullRequest
0 голосов
/ 11 мая 2018

У меня есть какой-то список

article = ["A",'B','C','D','E','F','G','H']
quote = ['','A','A','C','C','','A','B']
pd.DataFrame({'Article':article,'Quote':quote})

Это сделать иерархию путем цитирования цитируемых текстов.Я хочу этот иерархический формат.

enter image description here

В результате я хочу показать, что A цитируется B, B цитируется H. Как мне его кодировать?

1 Ответ

0 голосов
/ 11 мая 2018

Я не совсем уверен, что вы подразумеваете под этой иерархией, вы можете построить график для цитаты достаточно просто:

In []:
article = ["A",'B','C','D','E','F','G','H']
quote = ['','A','A','C','C','','A','B']
d = {}
for a, q in zip(article, quote):
    d.setdefault(q, []).append(a)
d

Out[]:
{'', ['A', 'F'], 'A': ['B', 'C', 'G'], 'B': ['H'], 'C': ['D', 'E']}

Вы можете визуализировать это с помощью простой рекурсивной функции:

def fn(g, n, depth=0):
    print('{: >{width}}'.format(n, width=depth*4))
    for nn in g.get(n, []):
        fn(g, nn, depth+1)

In []:
fn(d, '')

Out[]:

   A
       B
           H
       C
           D
           E
       G
   F

Или вы можете отобразить как сеть, используя networkx:

In []:
import networkx as nx
G = nx.Graph(d)
G.remove_node('')
nx.draw(G, with_labels=True)

Out[]:

enter image description here

Вы можете создать DataFrame, который вы ищете:

def fn(g, n):
    q = [[n]]
    while q:
        p = q.pop()
        if p[-1] not in d:
            yield p
            continue
        for n in g[p[-1]]:
            q.append(p + [n])

In []:
pd.DataFrame(list(reversed([(a, ','.join(q)) for _, a, *q in fn(d, '')])))

Out[]:
   0    1
0  A  B,H
1  A  C,D
2  A  C,E
3  A    G
4  F     

Который вы можете написать в Excel, используя возможности Panda.

...