2017-03-09 7 views
0

Ich habe eine CSV-Datei:csv in bestimmten Format Python JSon

Year , To , From , Number 
2005 , A , G , 10 
2005 , B , E , 20 
2005 , A , F , 30 
2006 , C , D , 40 
2006 , D , F , 50 

ich erwarte zu erhalten:

[ 
    { 
    'graph':{ 
     'links':[ 
     { 
      'target':'A', 
      'value':10, 
      'source':'G' 
     }, 
     { 
      'target':'B', 
      'value':20, 
      'source':'E' 
     }, 
     { 
      'target':'A', 
      'value':30, 
      'source':'F' 
     } 
     ], 
     'nodes':[ 
     { 
      'name':'A', 
      'node':index 
     }, 
     { 
      'name':'B', 
      'node':index 
     }, 
     { 
      'name':'E', 
      'node':index 
     }, 
     { 
      'name':'F', 
      'node':index 
     }, 
     { 
      'name':'G', 
      'node':index 
     } 
     ] 
    }, 
    'year':2005 
    }, 
    { 
    'graph':{ 
     'links':[ 
     { 
      'target':'C', 
      'value':40, 
      'source':'D' 
     }, 
     { 
      'target':'D', 
      'value':50, 
      'source':'F' 
     } 
     ], 
     'nodes':[ 
     { 
      'name':'C', 
      'node':index 
     }, 
     { 
      'name':'D', 
      'node':index 
     }, 
     { 
      'name':'F', 
      'node':index 
     } 
     ] 
    }, 
    'year':2006 
    } 
] 

Ich habe versucht, den Code der Umsetzung unter:

import pandas as pd 
df = pd.read_csv('test.csv') 
dict = [] 
link = { 
    "source":"", 
    "target":"", 
    "value":"" 
} 
node1 = { 
    "node": "", 
    "name": "" 
} 
node2 = { 
    "node": "", 
    "name": "" 
} 
collection = {"year":"", "graph":{ 
    "nodes":[], 
    "links":[] 
}} 
gd = df.groupby("Year") 
for name, group in gd: 
    group = group.reset_index(drop=True) 
    newC["year"] = group["Year"] 
    for i in range(0, len(group)): 
     node1["name"] = group["To"][i] 
     node2["name"] = group["From"][i] 
     link["value"] = group["Number"][i] 
     link["source"] = group["From"][i] 
     link["target"] = group["To"][i] 
     collection["graph"]["nodes"].append(node1) 
     collection["graph"]["nodes"].append(node2) 
     collection["graph"]["links"].append(link) 
    dict.append(collection) 
print(dict) 

Aber das ist die Ausgabe der Sammlung:

{ 
    'graph':{ 
    'links':[ 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     }, 
     { 
     'target':'D', 
     'value':50, 
     'source':'F' 
     } 
    ], 
    'nodes':[ 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     }, 
     { 
     'node':'', 
     'name':'D' 
     }, 
     { 
     'node':'', 
     'name':'F' 
     } 
    ] 
    }, 
    'year':0 2006 1 2006 Name:Year, 
    dtype:int64 
}   

Es ist offensichtlich falsch. Warum wiederholt die Ausgabe die letzte Zeile?

Antwort

0

Dies ist, weil Python, wenn Sie Link/Node in die Sammlung anfügen, nur eine "Referenz" auf Link/Node erstellen (d. H. Den Inhalt in Link/Node nicht vollständig kopiert, siehe Add an object to a python list). In der folgenden Iteration wird daher der Inhalt in der Sammlung geändert, wenn sich der Link/Knoten ändert.

Der folgende einfache Codes demonstrierte dieses Phänomen in Python:

mylist = [] 
for i in range(3): 
    link["source"] = i 
    mylist.append(link) 
    print(mylistA) 

wo link die gleichen wie in Ihrem Code ist. Die Ausgaben waren wie folgt.

[{'source': 0, 'target': '', 'value': ''}] 
[{'source': 1, 'target': '', 'value': ''}, {'source': 1, 'target': '', 'value': ''}] 
[{'source': 2, 'target': '', 'value': ''}, {'source': 2, 'target': '', 'value': ''}, {'source': 2, 'target': '', 'value': ''}] 

dies zu vermeiden, können Sie einfach copy, das heißt, beim Anhang, immer einen deep des entsprechenden Objekts angehängt wird. Mit dem gleichen Beispiel, der resultierende Code (nur die geänderte Linie zeigt, sind andere Linien gleich) sah aus wie:

mylist.append(copy.deepcopy(link)) 

Nach der Änderung werden Sie die gewünschten Ergebnisse erzielen.

+0

Danke, Lang. Es wirkt wie ein Zauber. – dcc

Verwandte Themen