具体格式为python的csv到json

时间:2017-03-09 04:07:14

标签: python json csv pandas

我有一个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
}        

显然是错的。为什么输出重复最后一行?

1 个答案:

答案 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))

更改后,您将获得所需的结果。