Pandas – df.to_dict(orient=”)
df.to_dict(orient="records") to bardzo praktyczna opcja Pandas, szczególnie gdy pracujesz z Flaskiem i zwracasz dane jako JSON.
orient="records" sprawia, że DataFrame zamienia się na listę słowników, gdzie każdy słownik to jeden wiersz.
To jest dokładnie taki format, jaki Flask/JS/API lubią najbardziej.
🧩 Przykład DataFrame
Załóżmy, że masz:
df = pd.DataFrame({
"date": ["2024-01-01", "2024-01-02"],
"value": [100, 105]
})
Porównanie orientów
1️⃣ orient=”records” (najczęściej używany w API)
df.to_dict(orient="records")
Wynik:
[
{"date": "2024-01-01", "value": 100},
{"date": "2024-01-02", "value": 105}
]
✔ idealne do JSON ✔ idealne do Flask jsonify() ✔ idealne do frontendu (JS, React, Vue) ✔ każdy wiersz to osobny obiekt
2️⃣ orient=”dict” (domyślny)
df.to_dict()
Wynik:
{
"date": {0: "2024-01-01", 1: "2024-01-02"},
"value": {0: 100, 1: 105}
}
❌ trudne do użycia w API ❌ kolumny jako klucze, a nie wiersze ❌ frontend tego nie lubi
3️⃣ orient=”list”
df.to_dict(orient="list")
Wynik:
{
"date": ["2024-01-01", "2024-01-02"],
"value": [100, 105]
}
✔ dobre do wykresów ❌ nie nadaje się na listę rekordów
4️⃣ orient=”index”
df.to_dict(orient="index")
Wynik:
{
"0": {"date": "2024-01-01", "value": 100},
"1": {"date": "2024-01-02", "value": 105}
}
✔ podobne do records ❌ ale kluczem jest indeks, nie lista
5️⃣ orient=”split”
df.to_dict(orient="split")
Wynik:
{
"index": [0, 1],
"columns": ["date", "value"],
"data": [
["2024-01-01", 100],
["2024-01-02", 105]
]
}
✔ dobre do serializacji DataFrame ❌ nieczytelne dla API
🧠 Dlaczego w Flasku używamy orient="records"?
Bo jsonify() oczekuje:
- listy,
- słowników,
- listy słowników.
A records daje dokładnie to:
json
[
{"kolumna1": "wartość", "kolumna2": "wartość"},
{"kolumna1": "wartość", "kolumna2": "wartość"}
]
To jest najbardziej naturalny format JSON.