2016-08-18 105 views
3

我有一個小數據框,想要轉換爲json文件。我想讓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}] 

不過,我喜歡的格式良好的作風。

任何幫助表示讚賞。

+0

我做了jsonlint驗證:{ \t 「787623」:[{ \t \t 「起始日期」: 「2016年3月13日」, \t \t 「訂購數量」: 「3110」, \t \t 「ID」 : 「2」 \t},{ \t \t 「起始日期」: 「2016年3月17日」, \t \t 「訂購數量」: 「676754」, \t \t 「ID」: 「1」 \t}] } – user1717931

回答

4

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

如果你沒有在標籤字段重複條目,一個班輪會工作。

+0

我編輯輸入有日期和hh:mm:ss格式。當我這樣做時,我得到一個錯誤:我得到一個錯誤:TypeError:Timestamp('2016-03-13 00:00:00')不是JSON可序列化 – user1717931

+0

看到這樣的SO帖子:'def date_handler(obj ): 如果hasattr(OBJ, 'isoformat'): 回報obj.isoformat() 其他: 加薪類型錯誤 打印json.dumps(數據,默認值= date_handler)' – user1717931

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

差不多。 ...除了「標籤」值不應該出現...因爲該值已經是關鍵。 – user1717931