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.