我有一个csv文件:
Year , To , From , Number
2005 , A , G , 10
2005 , B , E , 20
2005 , A , F , 30
2006 , C , D , 40
2006 , D , F , 50
我期待得到:
[
{
'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
}
]
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)
但这是集合的输出:
{
'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
}
显然是错的。为什么输出重复最后一行?
答案 0 :(得分:0)
这是因为当你将链接/节点附加到集合中时,Python只会创建一个"引用"指向链接/节点(即,它没有完全复制链接/节点中的内容,请参阅Add an object to a python list)。因此,在以下迭代中,集合中的内容将随着链接/节点的更改而更改。
以下简单代码在Python中演示了这种现象:
mylist = []
for i in range(3):
link["source"] = i
mylist.append(link)
print(mylistA)
其中link
与您的代码中的相同。产出如下。
[{'source': 0, 'target': '', 'value': ''}]
[{'source': 1, 'target': '', 'value': ''}, {'source': 1, 'target': '', 'value': ''}]
[{'source': 2, 'target': '', 'value': ''}, {'source': 2, 'target': '', 'value': ''}, {'source': 2, 'target': '', 'value': ''}]
为避免这种情况,您可以简单地使用copy
,即在追加时,始终附加相应对象的深层复制。使用相同的示例,结果代码(仅显示更改的行,其他行相同)看起来像:
mylist.append(copy.deepcopy(link))
更改后,您将获得所需的结果。