Pandas JSON

JSON(JavaScript Object Notation, JavaScript Object Notation), ist eine Syntax zum Speichern und Austauschen von Textinformationen, ähnlich wie XML.

JSON ist kleiner, schneller und einfacher zu parsen als XML. Für mehr JSON-Inhalte sieheJSON-Tutorial。

Pandas bietet leistungsstarke Methoden zur Verarbeitung von Daten im JSON-Format, unterstützt das Lesen von Daten aus JSON-Dateien oder -Strings und deren Konvertierung in einen DataFrame sowie die Konvertierung eines DataFrame zurück in das JSON-Format.

AktionMethodeBeschreibung
Daten aus JSON-Datei/-String lesenpd.read_json()JSON-Daten lesen und als DataFrame laden
DataFrame in JSON konvertierenDataFrame.to_json()DataFrame in JSON-Formatdaten konvertieren, Sie können die Strukturierungsmethode angeben
Unterstützte JSON-StrukturierungsformateorientParameterUnterstützt mehrere Strukturierungsformate, wie z. B.split、records、columns

Pandas kann JSON-Daten sehr bequem verarbeiten. Dieser Artikel verwendetsites.jsonals Beispiel, mit folgendem Inhalt:

Beispiel

[ { "id": "A001", "name": "Example", "url": "www.example.com", "likes": 61 }, { "id": "A002", "name": "Google", "url": "www.google.com", "likes": 124 }, { "id": "A003", "name": "Taobao", "url": "www.taobao.com", "likes": 45 } ]

Daten aus JSON-Datei/String laden

pd.read_json() - JSON-Daten lesen

read_json() wird verwendet, um Daten im JSON-Format als DataFrame zu lesen und zu laden. Es unterstützt das Laden von Daten aus JSON-Dateien, JSON-Strings oder JSON-URLs.

Syntaxformat:

import pandas as pd

df = pd.read_json(
    path_or_buffer,      # JSON 文件路径、JSON 字符串或 URL
    orient=None,         # JSON 数据的结构方式,默认是 'columns'
    dtype=None,          # 强制指定列的数据类型
    convert_axes=True,   # 是否转换行列索引
    convert_dates=True,  # 是否将日期解析为日期类型
    keep_default_na=True # 是否保留默认的缺失值标记
)

Parameter description:

ParameterBeschreibungStandardwert
path_or_bufferDer Pfad zur JSON-Datei, ein JSON-String oder eine URLErforderlicher Parameter
orientDefiniert die Formatierungsmethode von JSON-Daten. Häufige Werte sindsplit、records、index、columns、values。None(automatisch aus der Datei abgeleitet)
dtypeErzwingt die Angabe des Datentyps der SpaltenNone
convert_axesOb Achsen in geeignete Datentypen konvertiert werdenTrue
convert_datesOb Datumsangaben als Datumstypen geparst werdenTrue
keep_default_naOb Standardmarkierungen für fehlende Werte beibehalten werden (wie z. B.NaN)True

Häufige Optionen für den orient-Parameter:

orient-WertJSON-FormatbeispielBeschreibung
split{"index":["a","b"],"columns":["A","B"],"data":[[1,2],[3,4]]}Schlüssel verwendenindex、columnsunddataStruktur
records[{"A":1,"B":2},{"A":3,"B":4}]Jeder Datensatz ist ein Wörterbuch, das eine Datenzeile repräsentiert
index{"a":{"A":1,"B":2},"b":{"A":3,"B":4}}Verwendet den Index als Schlüssel, wobei die Werte Wörterbücher sind
columns{"A":{"a":1,"b":3},"B":{"a":2,"b":4}}Verwendet Spaltennamen als Schlüssel, wobei die Werte Wörterbücher sind
values[[1,2],[3,4]]Gibt nur Daten zurück, ohne Index- und Spaltennamen

Daten aus einer JSON-Datei laden:

Beispiel

import pandas as pd

df = pd.read_json('sites.json')
   
print(df.to_string())

to_string()Wird verwendet, um Daten vom DataFrame-Typ zurückzugeben. Wir können auch JSON-Zeichenketten direkt verarbeiten.

Beispiel

import pandas as pd

data =[
    {
      "id": "A001",
      "name": "Example",
      "url": "www.example.com",
      "likes": 61
    },
    {
      "id": "A002",
      "name": "Google",
      "url": "www.google.com",
      "likes": 124
    },
    {
      "id": "A003",
      "name": "Taobao",
      "url": "www.taobao.com",
      "likes": 45
    }
]
df = pd.DataFrame(data)

print(df)

Die Ausgabe des obigen Beispiels ist:

     id    name             url  likes
0  A001    Example  www.example.com     61
1  A002  Google  www.google.com    124
2  A003      淘宝  www.taobao.com     45

JSON-Objekte haben dasselbe Format wie Python-Dictionaries, daher können wir ein Python-Dictionary direkt in DataFrame-Daten umwandeln:

Beispiel

import pandas as pd


# JSON im Dictionary-Format
s = {
    "col1":{"row1":1,"row2":2,"row3":3},
    "col2":{"row1":"x","row2":"y","row3":"z"}
}

# JSON lesen und in DataFrame umwandeln
df = pd.DataFrame(s)
print(df)

Die Ausgabe des obigen Beispiels ist:

      col1 col2
row1     1    x
row2     2    y
row3     3    z

JSON-Daten von einer URL lesen:

Beispiel

import pandas as pd

URL = '/static.jyshare.com/download/sites.json?v=2'
df = pd.read_json(URL)
print(df)

Die Ausgabe des obigen Beispiels ist:

     id    name             url  likes
0  A001    Example  www.example.com     61
1  A002  Google  www.google.com    124
2  A003      淘宝  www.taobao.com     45

Daten aus einem JSON-String laden:

Beispiel

import pandas as pd

# JSON-String
json_data = '''
[
  {"Name": "Alice", "Age": 25, "City": "New York"},
  {"Name": "Bob", "Age": 30, "City": "Los Angeles"},
  {"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''


# Daten aus JSON-Zeichenkette lesen
df = pd.read_json(json_data)

print(df)

Ausgabe:

      Name  Age           City
0    Alice   25       New York
1      Bob   30    Los Angeles
2  Charlie   35        Chicago

Aus JSON-Daten lesen (orient als 'records' angeben):

Beispiel

import pandas as pd

# JSON-Daten
json_data = '''
[
  {"Name": "Alice", "Age": 25, "City": "New York"},
  {"Name": "Bob", "Age": 30, "City": "Los Angeles"},
  {"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''


# Daten aus JSON-String lesen, orient='records' angeben
df = pd.read_json(json_data, orient='records')

print(df)

Ausgabe:

      Name  Age           City
0    Alice   25       New York
1      Bob   30    Los Angeles
2  Charlie   35        Chicago

Verschachtelte JSON-Daten

Angenommen, es gibt eine Reihe von verschachtelten JSON-Datendateiennested_list.json :

Inhalt der Datei nested_list.json

{
    "school_name": "ABC primary school",
    "class": "Year 1",
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "math": 60,
        "Physik": 66,
        "Chemie": 61
    },
    {
        "id": "A002",
        "name": "James",
        "math": 89,
        "Physik": 76,
        "Chemie": 51
    },
    {
        "id": "A003",
        "name": "Jenny",
        "math": 79,
        "Physik": 90,
        "Chemie": 78
    }]
}

Verwenden Sie den folgenden Code, um den gesamten Inhalt zu formatieren:

Beispiel

import pandas as pd

df = pd.read_json('nested_list.json')

print(df)

Die Ausgabe des obigen Beispiels ist:

          school_name   class                                           students
0  ABC primary school  Year 1  {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...
1  ABC primary school  Year 1  {'id': 'A002', 'name': 'James', 'math': 89, 'p...
2  ABC primary school  Year 1  {'id': 'A003', 'name': 'Jenny', 'math': 79, 'p...

An diesem Punkt müssen wir diejson_normalize()Methode verwenden, um die verschachtelten Daten vollständig zu parsen:

Beispiel

import pandas as pd
import json

# Daten mit dem Python-JSON-Modul laden
with open('nested_list.json','r') as f:
    data = json.loads(f.read())

# Daten abflachen
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)

Die Ausgabe des obigen Beispiels ist:

     id   name  math  physics  chemistry
0  A001    Tom    60       66         61
1  A002  James    89       76         51
2  A003  Jenny    79       90         78

data = json.loads(f.read())Verwende das Python-JSON-Modul, um Daten zu laden.

json_normalize()Verwendete den Parameterrecord_pathund setzte ihn auf['students'], um verschachtelte JSON-Daten zu glättenstudents。

Das angezeigte Ergebnis enthält die Elemente school_name und class nicht. Wenn Sie sie anzeigen möchten, können Sie den meta-Parameter verwenden, um diese Metadaten anzuzeigen:

Beispiel

import pandas as pd
import json

# Daten mit dem Python-JSON-Modul laden
with open('nested_list.json','r') as f:
    data = json.loads(f.read())

# Daten abflachen
df_nested_list = pd.json_normalize(
    data,
    record_path =['students'],
    meta=['school_name', 'class']
)
print(df_nested_list)

Die Ausgabe des obigen Beispiels ist:

     id   name  math  physics  chemistry         school_name   class
0  A001    Tom    60       66         61  ABC primary school  Year 1
1  A002  James    89       76         51  ABC primary school  Year 1
2  A003  Jenny    79       90         78  ABC primary school  Year 1

Als Nächstes versuchen wir, komplexere JSON-Daten zu lesen, die Listen und Wörterbücher verschachteln. Die Datendateinested_mix.jsonlautet wie folgt:

Inhalt der Datei nested_mix.json

{
    "school_name": "lokale Grundschule",
    "class": "Year 1",
    "info": {
      "president": "John Kasich",
      "address": "ABC road, London, UK",
      "contacts": {
        "email": "[email protected]",
        "tel": "123456789"
      }
    },
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "math": 60,
        "Physik": 66,
        "Chemie": 61
    },
    {
        "id": "A002",
        "name": "James",
        "math": 89,
        "Physik": 76,
        "Chemie": 51
    },
    {
        "id": "A003",
        "name": "Jenny",
        "math": 79,
        "Physik": 90,
        "Chemie": 78
    }]
}

Konvertieren Sie die Datei nested_mix.json in einen DataFrame:

Beispiel

import pandas as pd
import json

# Daten mit dem Python-JSON-Modul laden
with open('nested_mix.json','r') as f:
    data = json.loads(f.read())
   
df = pd.json_normalize(
    data,
    record_path =['students'],
    meta=[
        'class',
        ['info', 'president'],
        ['info', 'contacts', 'tel']
    ]
)

print(df)

Die Ausgabe des obigen Beispiels ist:

     id   name  math  physics  chemistry   class info.president info.contacts.tel
0  A001    Tom    60       66         61  Year 1    John Kasich         123456789
1  A002  James    89       76         51  Year 1    John Kasich         123456789
2  A003  Jenny    79       90         78  Year 1    John Kasich         123456789

Lesen Sie eine Datenmenge aus verschachtelten Daten

Das Folgende ist die Beispieldateinested_deep.json, wir lesen nur dasmath-Feld der verschachtelten Daten

Inhalt der Datei nested_deep.json

{
    "school_name": "lokale Grundschule",
    "class": "Year 1",
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "grade": {
            "math": 60,
            "Physik": 66,
            "Chemie": 61
        }
 
    },
    {
        "id": "A002",
        "name": "James",
        "grade": {
            "math": 89,
            "Physik": 76,
            "Chemie": 51
        }
       
    },
    {
        "id": "A003",
        "name": "Jenny",
        "grade": {
            "math": 79,
            "Physik": 90,
            "Chemie": 78
        }
    }]
}

Hier müssen wir das Modulglomverwenden, um Datenverschachtelung zu verarbeiten;glomDas Modul ermöglicht es uns,.auf die Eigenschaften verschachtelter Objekte zuzugreifen.

Bevor wir es zum ersten Mal verwenden, müssen wir glom installieren:

pip3 install glom

Beispiel

import pandas as pd
from glom import glom

df = pd.read_json('nested_deep.json')

data = df['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)

Die Ausgabe des obigen Beispiels ist:

0    60
1    89
2    79
Name: students, dtype: int64

DataFrame in JSON konvertieren

DataFrame.to_json() - DataFrame in JSON-Daten konvertieren

Die Methode to_json() wird verwendet, um ein DataFrame in Daten im JSON-Format zu konvertieren, und Sie können die Strukturierungsmethode des JSON angeben.

Syntaxformat:

df.to_json(
    path_or_buffer=None,    # 输出的文件路径或文件对象,如果是 None 则返回 JSON 字符串
    orient=None,            # JSON 格式方式,支持 'split', 'records', 'index', 'columns', 'values'
    date_format=None,       # 日期格式,支持 'epoch', 'iso'
    default_handler=None,   # 自定义非标准类型的处理函数
    lines=False,            # 是否将每行数据作为一行(适用于 'records' oder  'split')
    encoding='utf-8'        # 编码格式
)

Parameter description:

ParameterBeschreibungStandardwert
path_or_bufferDer Ausgabedateipfad oder das Dateiobjekt; wenn esNone, dann wird eine JSON-Zeichenkette zurückgegebenNone
orientGibt die JSON-Formatstruktur an; unterstütztsplit、records、index、columns、valuesNone(Standard istcolumns)
date_formatDatumsformat, unterstützt'epoch'oder'iso'formatNone
default_handlerBenutzerdefinierte Behandlung nicht standardmäßiger Typen (wie z. B.datetimeusw.) VerarbeitungsfunktionNone
linesOb jede Datenzeile als eine Zeile ausgegeben werden soll (anwendbar aufrecordsodersplit)False
encodingKodierungsformat der Ausgabedatei'utf-8'

Beispiel

import pandas as pd

# DataFrame erstellen
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
})

# DataFrame in JSON-Zeichenkette konvertieren
json_str = df.to_json()

print(json_str)

DataFrame in JSON-Datei konvertieren (orient='records' angeben):

Beispiel

import pandas as pd

# DataFrame erstellen
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
})

# DataFrame in JSON-Datei konvertieren, orient='records' angeben
df.to_json('data.json', orient='records', lines=True)

# Inhalt der generierten Datei ausgeben:
# [
# {"Name":"Alice","Age":25,"City":"New York"},
# {"Name":"Bob","Age":30,"City":"Los Angeles"},
# {"Name":"Charlie","Age":35,"City":"Chicago"}
# ]

DataFrame in JSON konvertieren und Datumsformat angeben:

Beispiel

import pandas as pd

# DataFrame mit Datumsdaten erstellen
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Date': pd.to_datetime(['2021-01-01', '2022-02-01', '2023-03-01']),
    'Age': [25, 30, 35]
})

# DataFrame in JSON konvertieren und Datumsformat als 'iso' angeben
json_str = df.to_json(date_format='iso')

print(json_str)
<p>
Ausgabe:
{"Name":{"0":"Alice","1":"Bob","2":"Charlie"},"Date":{"0":"2021-01-01T00:00:00.000Z","1":"2022-02-01T00:00:00.000Z","2":"2023-03-01T00:00:00.000Z"},"Age":{"0":25,"1":30,"2":35}}
Andere Erweiterungen