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.
| Aktion | Methode | Beschreibung |
|---|---|---|
| Daten aus JSON-Datei/-String lesen | pd.read_json() | JSON-Daten lesen und als DataFrame laden |
| DataFrame in JSON konvertieren | DataFrame.to_json() | DataFrame in JSON-Formatdaten konvertieren, Sie können die Strukturierungsmethode angeben |
| Unterstützte JSON-Strukturierungsformate | orientParameter | Unterstü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
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:
| Parameter | Beschreibung | Standardwert |
|---|---|---|
path_or_buffer | Der Pfad zur JSON-Datei, ein JSON-String oder eine URL | Erforderlicher Parameter |
orient | Definiert die Formatierungsmethode von JSON-Daten. Häufige Werte sindsplit、records、index、columns、values。 | None(automatisch aus der Datei abgeleitet) |
dtype | Erzwingt die Angabe des Datentyps der Spalten | None |
convert_axes | Ob Achsen in geeignete Datentypen konvertiert werden | True |
convert_dates | Ob Datumsangaben als Datumstypen geparst werden | True |
keep_default_na | Ob Standardmarkierungen für fehlende Werte beibehalten werden (wie z. B.NaN) | True |
Häufige Optionen für den orient-Parameter:
| orient-Wert | JSON-Formatbeispiel | Beschreibung |
|---|---|---|
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
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
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
# 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
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
# 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
# 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
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 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 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 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
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:
| Parameter | Beschreibung | Standardwert |
|---|---|---|
path_or_buffer | Der Ausgabedateipfad oder das Dateiobjekt; wenn esNone, dann wird eine JSON-Zeichenkette zurückgegeben | None |
orient | Gibt die JSON-Formatstruktur an; unterstütztsplit、records、index、columns、values | None(Standard istcolumns) |
date_format | Datumsformat, unterstützt'epoch'oder'iso'format | None |
default_handler | Benutzerdefinierte Behandlung nicht standardmäßiger Typen (wie z. B.datetimeusw.) Verarbeitungsfunktion | None |
lines | Ob jede Datenzeile als eine Zeile ausgegeben werden soll (anwendbar aufrecordsodersplit) | False |
encoding | Kodierungsformat der Ausgabedatei | 'utf-8' |
Beispiel
# 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
# 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
# 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>
{"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