よしたく blog

ITエンジニアとして自分が知らなかったことをまとめています

Pandasでインデックス指向のJSONを読み込む

Pandas で JSON の key となる部分がインデックス指向*1となっているJSONを読み込ませたい場合、read_JSON()関数にorient='index'オプションを設定すればうまくいく。

pandas.pydata.org

サンプルデータ

{
  "0": {
    "name": "Nieves Finch",
    "gender": "male",
    "company": "XYQAG"
  },
  "1": {
    "name": "Frank Francis",
    "gender": "male",
    "company": "QUIZKA"
  },
  "2":{
    "name": "Erna Nieves",
    "gender": "female",
    "company": "ISOPLEX"
  }
}

まずはorient='index'オプション無しで読み込む

s = '''{
  "0": {
    "name": "Nieves Finch",
    "gender": "male",
    "company": "XYQAG"
  },
  "1": {
    "name": "Frank Francis",
    "gender": "male",
    "company": "QUIZKA"
  },
  "2":{
    "name": "Erna Nieves",
    "gender": "female",
    "company": "ISOPLEX"
  }
}
'''

df = pd.read_json(s)
df

0,1,2 をインデックスとしたいが、name, gender, companyがインデックスになっている。 これを読み込みの段階から正しくなるようにする。

 0   1   2
name    Nieves Finch    Frank Francis   Erna Nieves
gender  male    male    female
company XYQAG   QUIZKA  ISOPLEX

サンプルコード

s = '''{
  "0": {
    "name": "Nieves Finch",
    "gender": "male",
    "company": "XYQAG"
  },
  "1": {
    "name": "Frank Francis",
    "gender": "male",
    "company": "QUIZKA"
  },
  "2":{
    "name": "Erna Nieves",
    "gender": "female",
    "company": "ISOPLEX"
  }
}
'''

df = pd.read_json(s, orient='index')
df

無事に読み込む形が変わった!

 name    gender  company
0   Nieves Finch    male    XYQAG
1   Frank Francis   male    QUIZKA
2   Erna Nieves female  ISOPLEX

*1:インデックス指向のJSONという表現には若干違和感があったけど、Pandasではこのように表現するのが適切そうなので、このまま表記してみる