【问题标题】:write pandas data frame to a json file将熊猫数据框写入 json 文件
【发布时间】:2016-12-25 20:15:26
【问题描述】:

我有一个小数据框,想转换为 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变成了'key']。下面需要的

{
          "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}]

但是,我喜欢格式精美的样式。

感谢任何帮助。

【问题讨论】:

  • 我做了一个 jsonlint 验证:{ "787623": [{ "start_date": "2016-03-13", "Nums": "3110", "ID": "2" }, { "start_date": "2016-03-17", "Nums": "676754", "ID": "1" }] }

标签: json pandas


【解决方案1】:

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

例子:

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"
  }
 ]
}

如果您在标签字段中没有重复条目,则单行即可。

【讨论】:

  • 我将输入编辑为具有日期和 hh:mm:ss 格式。当我这样做时,我收到一个错误:我收到一个错误:TypeError: Timestamp('2016-03-13 00:00:00') is not JSON serializable
  • 看到一个关于这个的帖子:def date_handler(obj): if hasattr(obj, 'isoformat'): return obj.isoformat() else: raise TypeError print json.dumps(data, default=date_handler)
【解决方案2】:

应该这样做:

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}]}

【讨论】:

  • 差不多。 ...除了“标签”值不应该出现...因为该值已经是关键。
猜你喜欢
  • 2020-04-05
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 2014-03-28
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多