How to Export DataFrame to JSON with Pandas

In this quick tutorial, we'll show how to export DataFrame to JSON format in Pandas. We will cover different export options.

(1) save DataFrame to a JSON file

df.to_json('file.json')

(2) change JSON format and data

df.to_json('file.json', orient='split')

Note: Read also: how to save Pandas DataFrame to JSON file without backslashes

There are multiple options for parameter orient of method - to_json:

  • split - dict
    • {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values]}
  • records - list
    • [{column -> value}, … , {column -> value}]
  • index - dict
    • {column -> {index -> value}}
  • columns - dict (default for DataFrame)
    • {column -> {index -> value}}
  • values
    • just the values array
  • table - dict
    • {‘schema’: {schema}, ‘data’: {data}}
Pro Tip 1
For Pandas Series several options are available for export to JSON
{‘split’, ‘records’, ‘index’, ‘table’}

Setup

Let's create a sample DataFrame which will be exported to a JSON file:

import pandas as pd

data = {'day': [1, 2, 3, 4, 5, 6, 7, 8],
        'temp': [9, 8, 6, 13, 10, 15, 9, 10],
        'humidity': [0.89, 0.86, 0.54, 0.73, 0.45, 0.63, 0.95, 0.67]}

df = pd.DataFrame(data=data)

data looks like:

day temp humidity
0 1 9 0.89
1 2 8 0.86
2 3 6 0.54
3 4 13 0.73
4 5 10 0.45

1: Export DataFrame as JSON file

So let's start with the most simple example - exporting DataFrame as JSON string or a JSON file:

df.to_json('file.json')

If we provide the file name we will get a new JSON file created.

The output file path can be provided as relative path:

df.to_json(r'/home/json/file.json')
Pro Tip 1
NaN’s
and
None
will be converted to
null
and datetime objects will be converted to UNIX timestamps.

2: Export DataFrame as JSON string

Without file parameter - path_or_buf we will get JSON string:

df.to_json()

which will result into:

'{"day":{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7,"7":8},"temp":{"0":9,"1":8,"2":6,"3":13,"4":10,"5":15,"6":9,"7":10},"humidity":{"0":0.89,"1":0.86,"2":0.54,"3":0.73,"4":0.45,"5":0.63,"6":0.95,"7":0.67}}'

3: Export DataFrame as pretty JSON

Using parameter indent=True will prettify the JSON output of Pandas method to_json():

print(df.to_json(indent=True))

result:

{
 "day":{
  "0":1,
  "1":2,
  "2":3,
  "3":4,
  "4":5,
  "5":6,
  "6":7,
  "7":8
 },
 "temp":{
  "0":9,
  "1":8,
  "2":6,
  "3":13,
  "4":10,
  "5":15,
  "6":9,
  "7":10
 },
 "humidity":{
  "0":0.89,
  "1":0.86,
  "2":0.54,
  "3":0.73,
  "4":0.45,
  "5":0.63,
  "6":0.95,
  "7":0.67
 }
}

4: Export DataFrame JSON formats - orient

In this section we can see different JSON formats and data outputs.

4.1: columns - {column -> {index -> value}}

Let's start by the default export option for DataFrame - columns:

df.to_json()

is equivalent to df.to_json(orient='columns')

{"day":{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7,"7":8},
"temp":{"0":9,"1":8,"2":6,"3":13,"4":10,"5":15,"6":9,"7":10},
"humidity":{"0":0.89,"1":0.86,"2":0.54,"3":0.73,"4":0.45,"5":0.63,"6":0.95,"7":0.67}}

4.2: split - {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values]}

Using orient with option split will give us:

df.to_json(orient='split')

JSON with keys - columns, index and data:

{"columns":["day","temp","humidity"],
"index":[0,1,2,3,4,5,6,7],
"data":[[1,9,0.89],[2,8,0.86],[3,6,0.54],[4,13,0.73]..]}

4.3: records - [{column -> value}, … , {column -> value}]

For records we get list of dictionaries - each row as a new entry in the output JSON:

df.to_json(orient='records')

result:

[
{"day":1,"temp":9,"humidity":0.89},
{"day":2,"temp":8,"humidity":0.86},
{"day":3,"temp":6,"humidity":0.54},
{"day":4,"temp":13,"humidity":0.73},
{"day":5,"temp":10,"humidity":0.45}..]

4.4: index - {index -> {column -> value}}

With option index we got JSON file formatted as - index/data pairs:

df.to_json(orient='index')

result:

{"0":{"day":1,"temp":9,"humidity":0.89},
"1":{"day":2,"temp":8,"humidity":0.86},
"2":{"day":3,"temp":6,"humidity":0.54},
"3":{"day":4,"temp":13,"humidity":0.73},
"4":{"day":5,"temp":10,"humidity":0.45}..}

4.5: orient='values' <-> df.values

The option orient='values' is similar to df.values:

df.to_json(orient='values')

resulted JSON data is:

[[1,9,0.89],[2,8,0.86],[3,6,0.54],[4,13,0.73],[5,10,0.45],[6,15,0.63],[7,9,0.95],[8,10,0.67]]

4.6: table - {‘schema’: {schema}, ‘data’: {data}}

Finally we can use the option table. This give us DB like and JSON schema like JSON export of a DataFrame:

df.to_json(orient='table')

which results in next JSON schema:

{
 "schema":
 {
  "fields":
  [
   {
    "name": "index",
    "type": "integer"
   },
   {
    "name": "day",
    "type": "integer"
   },
   {
    "name": "temp",
    "type": "integer"
   },
   {
    "name": "humidity",
    "type": "number"
   }
  ],
  "primaryKey":
  [
   "index"
  ],
  "pandas_version": "1.4.0"
 },
 "data":
 [
  {
   "index": 0,
   "day": 1,
   "temp": 9,
   "humidity": 0.89
  },
  {
   "index": 1,
   "day": 2,
   "temp": 8,
   "humidity": 0.86
  },
  {
   "index": 2,
   "day": 3,
   "temp": 6,
   "humidity": 0.54
  },
  {
   "index": 3,
   "day": 4,
   "temp": 13,
   "humidity": 0.73
  }
 ]
}

5: Export DataFrame as JSON lines

To save Pandas DataFrame as JSON lines we can use two parameters:

  • orient='records'
  • lines=True
df.to_json(orient='records', lines=True)

this gives JSON line output:

{"day":1,"temp":9,"humidity":0.89}
{"day":2,"temp":8,"humidity":0.86}
{"day":3,"temp":6,"humidity":0.54}
{"day":4,"temp":13,"humidity":0.73}

Conclusion

In this article we saw how to export DataFrame as a JSON string of files. We show how to pretty print the JSON output.

We show different JSON formats and export to JSON lines.