将pandas数据帧写入json文件

时间:2016-08-18 19:20:22

标签: json pandas

我有一个小数据框,想要转换为json文件。我希望json文件格式不错(使用缩进等)。另外,我希望数据帧的其中一列成为json数据的关键。这是一个例子:

输入数据框:

    start_date  Nums  ID     tag
51 2016-03-13 00:00:00       3110            2  787623
55 2016-03-17 00:00:00     676754            1  787623

json的所需输出格式:[注意:索引51和55消失,标记值78723已成为'键']。以下要求

{
          "787623": [{
              "start_date": "2016-03-13", 
              "Nums": "3110",
              "ID": "2"
           }, {
              "start_date": "2016-03-17", 
              "Nums": "676754",
              "ID": "1"
           }]
}

目前,我正在做一个简单的df.to_json(jsonFile, date_format = 'iso', orient = 'records'),它产生一个更紧凑的json文件,如下所示:

[{"start_date":"2016-03-13T00:00:00.000Z","Nums":3110,"ID":2,"tag":787623},{"start_date":"2016-03-17T00:00:00.000Z","Nums":676754,"ID":1,"tag":787623}]

但是,我喜欢格式很好的风格。

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

DataFrame.to_dict()方法有很多关于字典布局方式的选项。然后,您可以使用indent模块函数中的json选项来创建格式正确的字符串。

示例:

d={}
for tag,group in df.set_index('tag').groupby(level='tag'):
    d[str(tag)]=group.to_dict(orient='records')
print(json.dumps(d,indent=1))

给出

{
 "787623": [
  {
   "ID": 2,
   "Nums": 3110,
   "start_date": "2016-03-13"
  },
  {
   "ID": 1,
   "Nums": 676754,
   "start_date": "2016-03-17"
  }
 ]
}

如果你在标签字段中没有重复的条目,那么单线程就行了。

答案 1 :(得分:1)

这应该这样做:

df.groupby('tag').apply(lambda df: df.to_dict(orient='records')).to_json(date_format='iso')

{"787623":[{"ID":2,"tag":787623,"start_date":"2016-03-13","Nums":3110},{"ID":1,"tag":787623,"start_date":"2016-03-17","Nums":676754}]}